|
|
|
повторное соединение клиента TCP после разрыва соединения
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Если кто сталкивался подскажите пожалуйста, в чём проблема. Пишу клиента TCP, использую модель WSAEventSelect. После разрыва соединения, я периодически пытаюсь восстановить соединение, вызывая connect. Но функция connect стартует с ошибкой. WSAGetLastError возращает 10056. В MSDN написано, что данная ошибка возникает, когда иницируется соединение на сокете, но я закрывал соединение с помощью shutdown при возникновении события FD_CLOSE. Код примерно такой. Переменная _connected устанавливается в событии FD_CONNECTED и сбрасывается в FD_CLOSE. Зараннее спасибо. while (true) { retVal = WSAWaitForMultipleEvents(1,eventArray,false,timeOut,false); switch(retVal) { case WSA_WAIT_TIMEOUT: EnterCriticalSection(&client->cs); tempConnected = client->_connected; LeaveCriticalSection(&client->cs); if (!tempConnected) { retVal = connect(client->_socket,(LPSOCKADDR)&serverInfo,sizeof(serverInfo)); if (retVal == SOCKET_ERROR) { retVal = WSAGetLastError(); if (retVal != WSAEWOULDBLOCK) { /* closesocket(client->_socket); WSACleanup(); return ERR_FAILED_TO_CALL_CONNECT;*/ } } } break; case 0: WSAEnumNetworkEvents(client->_socket,eventArray[0],&wsaEvents); if(wsaEvents.lNetworkEvents & FD_CONNECT) { if(wsaEvents.iErrorCode[FD_CONNECT_BIT]) { printf("Error %d\n",wsaEvents.iErrorCode[FD_CONNECT_BIT]); retVal = connect(client->_socket,(LPSOCKADDR)&serverInfo,sizeof(serverInfo)); } else { client->SetConnected(true); client->OnConnected();//Перегружается в дочернем классе } } if (wsaEvents.lNetworkEvents & FD_READ) { if (!wsaEvents.iErrorCode[FD_READ_BIT]) { client->OnReceive(); } } if (wsaEvents.lNetworkEvents & FD_CLOSE) { shutdown(client->_socket,SD_BOTH); // client->CloseConnection(); client->SetConnected(false); client->OnDisconnected();//Перегужается в дочернем классе } break; } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 16:04:20 |
|
||
|
повторное соединение клиента TCP после разрыва соединения
|
|||
|---|---|---|---|
|
#18+
Вы что, пытаетесь снова вызвать connect на том же сокете ? Это неправильно. Сокет надо закрыть closesocket() и создать новый socket() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 16:28:49 |
|
||
|
повторное соединение клиента TCP после разрыва соединения
|
|||
|---|---|---|---|
|
#18+
Спасибо. Я этого не знал. Я считал, что после вызова shutdown можно опять вызывать connectю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 16:35:42 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34939402&tid=2027814]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 453ms |

| 0 / 0 |
