Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Сервер не отвечает


Автор: mrbrooks 3.10.2007, 08:06
Комрады подсобите - все компилится - все шевелится тока сервак не отвечает взаимностью. 
На фукции WSAWaitForMultipleEvents соответственно превышается ожидание. В роли сервера выступает котроллер.
Код

#include <vcl.h>
#include <winsock2.h>
#include <winbase.h>

#pragma comment (lib, "ws2_32.lib")

#define NumbG 200
#define ColNumbG 50

void CloseLan();
bool ActionX();
void InOutThread();

WSANETWORKEVENTS hConEvent;
WSADATA data;
SOCKET sock = INVALID_SOCKET;
struct sockaddr_in saddr;
DWORD dword = MAKEWORD(2,2);
int wsaerror;
WSAEVENT hWSAEvent;
HANDLE hEvent;
HANDLE hThreadG;
int StatusWork = 0;
char DataG[NumbG];
int DBDataG[ColNumbG];
int SNumbG;
bool Status = 1;
DWORD dwThreadIDL;
//---------------------------------------------------------------------------
void CloseLan()
{
if (hWSAEvent != NULL) WSACloseEvent(hWSAEvent);
closesocket(sock);
WSACleanup();
MainForm->MainSB->Panels->Items[3]->Text = ("Отключение...");
StatusWork = 0;
MainForm->MainMemo->Lines->Add("Сокет закрыт");

}
//---------------------------------------------------------------------------
void InOutThread()
{
char buf[1] = {43};
DWORD VarL;
DWORD EventSignal;
//hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
hWSAEvent = WSACreateEvent();
WSAEventSelect(sock, hWSAEvent, FD_READ);

while (StatusWork != 0)
{
        EventSignal = WSAWaitForMultipleEvents(1,&hWSAEvent,FALSE,5000,FALSE); // вот здесь вся загвоздка
        MainForm->MainMemo->Lines->Add(EventSignal);
        MainForm->MainMemo->Lines->Add("Подключение ...");

        //EventSignal = WSA_WAIT_EVENT_0;
        switch (EventSignal)
               {
                case WSA_WAIT_EVENT_0:
                        MainForm->MainMemo->Lines->Add("Шаг первый выполнен...");
                        WSAEnumNetworkEvents(sock,hWSAEvent,&hConEvent);
                        switch (hConEvent.lNetworkEvents)
                                {
                                case FD_READ: if (hConEvent.iErrorCode[FD_READ_BIT]!= 0)
                                                {
                                                MainForm->MainMemo->Lines->Add("Ошибка чтения !!!");
                                                break;
                                                }
                                        switch (recv(sock,DataG,NumbG,0))
                                                {
                                                case SOCKET_ERROR:
                                                        MainForm->MainMemo->Lines->Add("Данные не поступают !!!");
                                                        break;
                                                default:
                                                        MainForm->MainMemo->Lines->Add("Данные поступают !!!");
                                                        switch(DataG[0])
                                                                {
                                                                case 43:
                                                                        DataG[18] = 13;
                                                                        DataG[19] = 10;
                                                                        break;
                                                                default:
                                                                        for (VarL = 0; VarL < ColNumbG; VarL ++)
                                                                             DBDataG[VarL] = ((int*)(DataG))[VarL];
                                                                        SNumbG ++;
                                                                        buf[0] = 0x36;
                                                                        send(sock, buf, 1, 0);
                                                                        break;
                                                                }
                                                break;
                                                }
                                 MainForm->MainMemo->Lines->Add("Твою мать мля...!");
                                }
                break;
                case WSA_WAIT_TIMEOUT:
                        buf[0] = 0x33;
                        send(sock,buf,1,0);
                        MainForm->MainMemo->Lines->Add("Нет ответа!");
                        break;
                }
MainForm->MainMemo->Lines->Add("Переход на новый цикл...");
WSAResetEvent(hWSAEvent);
}
MainForm->MainMemo->Lines->Add("Status Work = 0");

}
//---------------------------------------------------------------------------
bool ActionX()
{

hWSAEvent = NULL;
wsaerror = WSAStartup(dword, &data);
        if (wsaerror == NO_ERROR) MainForm->MainMemo->Lines->Add("Complite - WSAStartup()");
        else
            {
             MainForm->MainMemo->Lines->Add("Error - WSAStartup()");
             WSACleanup();
             return false;
            }
        sock = socket(AF_INET,SOCK_STREAM,0);
        if (sock != INVALID_SOCKET) MainForm->MainMemo->Lines->Add("Complite - socket()");
        else
            {
             MainForm->MainMemo->Lines->Add("Error - socket()");
             closesocket(sock);
             WSACleanup();
             return false;
            }
        saddr.sin_family = AF_INET;
        saddr.sin_addr.S_un.S_addr = inet_addr("195.17.17.155");
        saddr.sin_port = htons(1075);
        wsaerror = connect(sock, (SOCKADDR*)&saddr, sizeof(saddr));
        if (wsaerror == 0) MainForm->MainMemo->Lines->Add("Complite - connect()");
        else
                {
                MainForm->MainMemo->Lines->Add("Error - connect()");
                CloseLan();
                return false;
                }
        hThreadG = CreateThread(NULL, NULL, (PTHREAD_START_ROUTINE)InOutThread, 0, 0, &dwThreadIDL);
return true;
}

может чего нибудь посоветуете по сложившемуся вопросу.

Автор: Comm 3.10.2007, 17:29
В последнее время тут мало кто отвечает на вопросы   smile 
Код

 EventSignal = WSAWaitForMultipleEvents(1,&hWSAEvent,FALSE,5000,FALSE);

Попробуй вместо 5000 поставить константу WSA_INFINITE (Ожидать бесконечно)

Автор: mrbrooks 4.10.2007, 07:37
Цитата(Comm @ 3.10.2007,  17:29)
В последнее время тут мало кто отвечает на вопросы

Очень плохо. 
 WSA_INFINITE - неподходит увы по определению 
 smile 
Контроллер надо опрашивать постоянно. Порою раз в секунду а то и меньше.

Автор: ptr 4.10.2007, 15:33
Цитата(mrbrooks @  4.10.2007,  10:37 Найти цитируемый пост)
Контроллер надо опрашивать постоянно

Опрашивать или регистрировать? Как я понимаю опрос - это двунаправленное общение с сервером. У тебя я этого не заметил.

А по коду я ничего, кроме глобальных переменных, сильно криминального не нашел.

Цитата(Comm @  3.10.2007,  20:29 Найти цитируемый пост)
В последнее время тут мало кто отвечает на вопросы    

А тут так всегда smile . Я уже не помню когда последний раз тут модераторов видел. Так что не удивляйтесь, что отвечают только через несколько дней smile .

Автор: Comm 5.10.2007, 04:52
Модераторов++
=)

Автор: mrbrooks 5.10.2007, 07:24
Цитата(ptr @ 4.10.2007,  15:33)

Опрашивать или регистрировать? Как я понимаю опрос - это двунаправленное общение с сервером. У тебя я этого не заметил.


Опрашивать. Дело в том что в контроллере есть архив. Из этого архива по моей просьбе нужно вытащить информацию. Но если правильно я тебя понял - я контроллер (сервер) не опрашиваю? 

ЗЫ. С переменными я разберусь - причем самым радикальным способом но опосля. smile 

Автор: ptr 5.10.2007, 07:44
Цитата(mrbrooks @  5.10.2007,  10:24 Найти цитируемый пост)
Из этого архива по моей просьбе нужно вытащить информацию.

А где ты просьбу то посылаешь? Ты уверен, что контроллер должен тебе чем-то отвечать, когда ты подключился?

Автор: mrbrooks 5.10.2007, 07:56
Цитата(ptr @ 5.10.2007,  07:44)

А где ты просьбу то посылаешь? Ты уверен, что контроллер должен тебе чем-то отвечать, когда ты подключился?

Конечно должен. Для этого на контроллере и соответствующий софт есть. Он должен со мной дружить. Даже просто обязан.

Автор: ptr 5.10.2007, 08:12
Да я не про то smile . Тебе вначале ничего ему послать не надо. Он первый данные посылает?

Автор: mrbrooks 5.10.2007, 13:40
Надо. Но ведь я ожидаю от него сигнала и если его нет то посылаю ему запрос если он молчит. Смотри switch. А вот когда отвечает работает уже соответственно другая ветка. Но блин все. Мозг уже сломан. smile  smile 

Автор: ptr 6.10.2007, 15:13
Я не вижу явной ошибки. Возьми сниффер да и посмотри за трафиком.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)