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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разрыв соединения 
:(
    Опции темы
zss
Дата 18.7.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я пытаюсь передавать данные и проверяю результат на
Код

int bytes = ::send(...);
if (bytes == SOCKET_ERROR)
{
    ...
    return false;
}
return true;


аналогично и для чтения данных.

Но в данной ситуации не совсем понятно когда данные просто не удалось передеть по какой-то причине и требуется повтор 
И когда соединение разорвано и нужно его заново устанавливать.

Как определить разрыв ? 

P.S. И что думать, если например число запрошенных байт не совпадает с числом принятых.
Тоесть верно ли 
Код

bool send (..., int size, ...)
    int bytes = ::send(..., size, ...);
    if (bytes == SOCKET_ERROR)
    {
        ...
        return false;
    }
    return (bytes == size);
}

PM MAIL ICQ   Вверх
bsa
Дата 18.7.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Читай документацию на send. В частности, значения errno
PM   Вверх
W4FhLF
Дата 18.7.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

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



WSAGetLastError?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
zss
Дата 18.7.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



странно, но например для recv я не нашел errno - есть только WSAGetLastError.

Кстати вот список
Код

WSANOTINITIALISED            A successful WSAStartup call must occur before using this function.  
WSAENETDOWN                   The network subsystem has failed.  
WSAEFAULT                          The buf parameter is not completely contained in a valid part of the user address space.  
WSAENOTCONN                    The socket is not connected.  
WSAEINTR                            The socket was closed.  
WSAEINPROGRESS               A blocking Winsock call is in progress, or the service provider is still processing a callback function.  
WSAENETRESET                   The connection has been broken due to the keep-alive activity detecting a failure while the operation was in progress.  
WSAENOTSOCK                    The descriptor is not a socket. 
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not stream style such as type SOCK_STREAM, out of band (OOB) data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only send operations. 
 
WSAESHUTDOWN                 The socket has been shut down; it is not possible to receive on a socket after shutdown has been invoked with how    set to SD_RECEIVE or SD_BOTH.  
WSAEWOULDBLOCK              The socket is marked as nonblocking and the receive operation would block.  
WSAEMSGSIZE                      The message was too large to fit into the specified buffer and was truncated. 
WSAEINVAL                           The socket has not been bound with bind (Windows Sockets), an unknown flag was specified, MSG_OOB was specified for a socket with SO_OOBINLINE enabled, or (for byte stream sockets only) len was zero or negative.  
WSAECONNABORTED            The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no longer usable.  
WSAETIMEDOUT                    The connection has been dropped because of a network failure or because the peer system failed to respond.  
WSAECONNRESET  



теоритически мне подходит
WSAENETRESET
WSAESHUTDOWN
WSAECONNABORTED 
WSAETIMEDOUT
WSAECONNRESET 


я ничего не упустил ?
PM MAIL ICQ   Вверх
zss
Дата 19.7.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в MSDN есть пример, в котором проверка на
Код

bytesRecv == 0 || bytesRecv == WSAECONNRESET


думаю этого достаточно.

Но вот меня смутило описание для send
Код

If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len


Это как ? Как тогда - цикл крутить пока не отправилось ?
И нужно ли это для recv или только для send ?
PM MAIL ICQ   Вверх
leniviy
Дата 27.7.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bytesRecv == WSAECONNRESET - это имхо ересь. Надо WsaGetLastError()==WSAECONNRESET
Но на самом деле достаточно проверять 
(bytesRecv == 0) || (bytesRecv == SOCKET_ERROR)
Цитата(zss @  18.7.2007,  02:19 Найти цитируемый пост)
Но в данной ситуации не совсем понятно когда данные просто не удалось передеть по какой-то причине и требуется повтор 
И когда соединение разорвано и нужно его заново устанавливать.

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


 




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


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

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