разрыв соединения

 
0
 
C++
ava
zss | 18.07.2007, 11:19
я пытаюсь передавать данные и проверяю результат на

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);
}
Ответы (5)
ava
bsa | 18.07.2007, 11:47 #
Читай документацию на send. В частности, значения errno
ava
W4FhLF | 18.07.2007, 14:07 #
WSAGetLastError?
ava
zss | 18.07.2007, 15:50 #
странно, но например для 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


я ничего не упустил ?
ava
zss | 19.07.2007, 00:14 #
в 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 ?
ava
leniviy | 27.07.2007, 15:45 #
bytesRecv == WSAECONNRESET - это имхо ересь. Надо WsaGetLastError()==WSAECONNRESET
Но на самом деле достаточно проверять
(bytesRecv == 0) || (bytesRecv == SOCKET_ERROR)
Цитата (zss @  18.7.2007,  02:19 findReferencedText)
Но в данной ситуации не совсем понятно когда данные просто не удалось передеть по какой-то причине и требуется повтор 

И когда соединение разорвано и нужно его заново устанавливать.


Для протокола TCP не может быть такой ситуации, на прикладном уровне ты не должен об этом задумываться. 
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  leniviy   zss ava  bsa   W4FhLF
advanced
Отправить