powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / повторное соединение клиента TCP после разрыва соединения
4 сообщений из 4, страница 1 из 1
повторное соединение клиента TCP после разрыва соединения
    #34939268
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Если кто сталкивался подскажите пожалуйста, в чём проблема.
Пишу клиента 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;
}
}
...
Рейтинг: 0 / 0
повторное соединение клиента TCP после разрыва соединения
    #34939368
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы что, пытаетесь снова вызвать connect на том же сокете ? Это неправильно. Сокет надо закрыть closesocket() и создать новый socket()
...
Рейтинг: 0 / 0
повторное соединение клиента TCP после разрыва соединения
    #34939402
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Я этого не знал. Я считал, что после вызова shutdown можно опять вызывать connectю
...
Рейтинг: 0 / 0
повторное соединение клиента TCP после разрыва соединения
    #34939440
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть при возникновении события FD_CLOSE нужно закрыть сокет, а затем создать новый сокет с помощью функции сокет и с помощью WSAEventSelect назначить для него события.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / повторное соединение клиента TCP после разрыва соединения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]