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