Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервер не отвечает, WSAWaitForMultipleEvents  
V
    Опции темы
mrbrooks
Дата 3.10.2007, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Комрады подсобите - все компилится - все шевелится тока сервак не отвечает взаимностью. 
На фукции 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;
}

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

Это сообщение отредактировал(а) mrbrooks - 3.10.2007, 08:15
PM MAIL   Вверх
Comm
Дата 3.10.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



В последнее время тут мало кто отвечает на вопросы   smile 
Код

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

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

Это сообщение отредактировал(а) Comm - 3.10.2007, 17:49


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
mrbrooks
Дата 4.10.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



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

Очень плохо. 
 WSA_INFINITE - неподходит увы по определению 
 smile 
Контроллер надо опрашивать постоянно. Порою раз в секунду а то и меньше.
PM MAIL   Вверх
ptr
Дата 4.10.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



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

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

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

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

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

Это сообщение отредактировал(а) ptr - 4.10.2007, 15:35


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Comm
Дата 5.10.2007, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Модераторов++
=)


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
mrbrooks
Дата 5.10.2007, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(ptr @ 4.10.2007,  15:33)

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


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

ЗЫ. С переменными я разберусь - причем самым радикальным способом но опосля. smile 
PM MAIL   Вверх
ptr
Дата 5.10.2007, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



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

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

Это сообщение отредактировал(а) ptr - 5.10.2007, 07:44


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
mrbrooks
Дата 5.10.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(ptr @ 5.10.2007,  07:44)

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

Конечно должен. Для этого на контроллере и соответствующий софт есть. Он должен со мной дружить. Даже просто обязан.
PM MAIL   Вверх
ptr
Дата 5.10.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Да я не про то smile . Тебе вначале ничего ему послать не надо. Он первый данные посылает?

Это сообщение отредактировал(а) ptr - 6.10.2007, 09:14


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
mrbrooks
Дата 5.10.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Надо. Но ведь я ожидаю от него сигнала и если его нет то посылаю ему запрос если он молчит. Смотри switch. А вот когда отвечает работает уже соответственно другая ветка. Но блин все. Мозг уже сломан. smile  smile 
PM MAIL   Вверх
ptr
Дата 6.10.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Я не вижу явной ошибки. Возьми сниффер да и посмотри за трафиком.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.