Приходят данные после того как соединение закрыто (IOCP)
От: _facelift  
Дата: 06.05.15 17:26
Оценка:
Всем привет.
Есть сервер на IOCP. Я телнетом 10 раз получил данные, и потом закрываю телнетом соединение. В итоге потом сервер 9 раз получает данные с размером 0.
Т.е. ничего не получает. Сокет закрыт.

Никто на знает что это такое? Никто не сталкивался?
Re: Приходят данные после того как соединение закрыто (IOCP)
От: _facelift  
Дата: 06.05.15 17:28
Оценка:
WireShark говорит что это не пакеты, а блаж IOCP. С пакетами все ОК FIN->ACK, FIN->ACK, больше ничего нет.
Re: Приходят данные после того как соединение закрыто (IOCP)
От: Nikolay_Ch Россия  
Дата: 07.05.15 06:40
Оценка:
_>Есть сервер на IOCP. Я телнетом 10 раз получил данные, и потом закрываю телнетом соединение. В итоге потом сервер 9 раз получает данные с размером 0.
Что такое "получает данные"? Можно кусок кода?
Re: Приходят данные после того как соединение закрыто (IOCP)
От: pykd_team  
Дата: 07.05.15 07:14
Оценка:
_>Всем привет.
_>Есть сервер на IOCP. Я телнетом 10 раз получил данные, и потом закрываю телнетом соединение. В итоге потом сервер 9 раз получает данные с размером 0.
_>Т.е. ничего не получает. Сокет закрыт.

Приведите кусочек кода, где вы работаете с IOCP, по-моему вы что то не то делаете.
http://pykd.codeplex.com
Re[2]: Приходят данные после того как соединение закрыто (IOCP)
От: _facelift  
Дата: 07.05.15 08:33
Оценка:
Пожалуйста

_socket = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, NULL, WSA_FLAG_OVERLAPPED);

if (WsaAcceptEx == 0)
{
DWORD dwBytes = 0;
WSAIoctl(_socket,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidAcceptEx,
sizeof(GuidAcceptEx),
&WsaAcceptEx,
sizeof(WsaAcceptEx),
&dwBytes, NULL, NULL);
}

_buffer = new char[DEFAULT_BUFFER_SIZE];
_bufferSize = DEFAULT_BUFFER_SIZE;

_wsaBuffer.buf = _buffer;
_wsaBuffer.len = DEFAULT_BUFFER_SIZE;

ZeroMemory(&_ov, sizeof(IOCP_OVERLAPPED));
-----------------------------------------
TcpSocket *sock = new TcpSocket(true);

DWORD dwBytes = 0;
ZeroMemory(&_ov, sizeof(OVERLAPPED));

int iResult = 0;

SOCKET acceptSocket = sock->handle();

// iResult = setsockopt(acceptSocket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
// (char *)&acceptSocket, sizeof(acceptSocket)) ;

if (!WsaAcceptEx(_socket, sock->handle(), sock->buffer(),
sock->bufferSize() — ((sizeof(sockaddr_in) + 16) * 2),
sizeof(sockaddr_in) + 16, sizeof(sockaddr_in) + 16,
&dwBytes, &sock->_ov))
{
printf("AcceptEx failed: %i\n", WSAGetLastError());
}

return sock;
-----------------------------------------
if (GetQueuedCompletionStatus(_iocp, &size, &key, &poverlapped, _timeout))
{
IOCP_OVERLAPPED *ov = (IOCP_OVERLAPPED *)poverlapped;

// Another code
}
-----------------------------------------
DWORD flags = 0;
ZeroMemory(&_ov, sizeof(OVERLAPPED));

_wsaBuffer.len = size;

int r = WSASend(_socket, &_wsaBuffer, 1, NULL, flags, &_ov, 0);

if (r == 0)
{
return -1;
}

return r;
Re[2]: Приходят данные после того как соединение закрыто (IOCP)
От: _facelift  
Дата: 07.05.15 08:34
Оценка:
Тут ответил

http://rsdn.ru/forum/network/6039972.1
Автор: _facelift
Дата: 07.05.15
Re[3]: Приходят данные после того как соединение закрыто (IOCP)
От: Nikolay_Ch Россия  
Дата: 07.05.15 08:47
Оценка:
Здравствуйте, _facelift, Вы писали:

_>Тут ответил


_>http://rsdn.ru/forum/network/6039972.1
Автор: _facelift
Дата: 07.05.15

А прием данных то где?
Re[4]: Приходят данные после того как соединение закрыто (IOCP)
От: _facelift  
Дата: 07.05.15 09:00
Оценка:
Тоже самое

DWORD flags = 0;
ZeroMemory(&_ov, sizeof(OVERLAPPED));

_wsaBuffer.len = size — 1;

int r = WSARecv(_socket, &_wsaBuffer, 1, NULL, &flags, &_ov, 0);

if (r == 0)
{
return -1;
}

return r;
Re[5]: Приходят данные после того как соединение закрыто (IOCP)
От: Nikolay_Ch Россия  
Дата: 07.05.15 09:04
Оценка:
Здравствуйте, _facelift, Вы писали:

Из доков на функцию WSARecv:

If no error occurs and the receive operation has completed immediately, WSARecv returns zero. In this case, the completion routine will have already been scheduled to be called once the calling thread is in the alertable state. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Как бы возвращение ноля — это успех, а не ошибка. А по Вашему коду — это ошибка.
Re[6]: Приходят данные после того как соединение закрыто (IOCP)
От: _facelift  
Дата: 07.05.15 09:13
Оценка:
У нас 0, и ошибка 997 (PENDING) — это значит все ОК. Я проверяю ошибки, но не в этом месте.
Типа 0 — не послали, а поставили в очередь.
Re[7]: Приходят данные после того как соединение закрыто (IOCP)
От: _facelift  
Дата: 07.05.15 09:19
Оценка:
Прошу у всех прощения. Была моя ошибка — 2 раза делаю read.

Всем спасибо.
Re[7]: Приходят данные после того как соединение закрыто (IOCP)
От: Nikolay_Ch Россия  
Дата: 07.05.15 09:25
Оценка:
Здравствуйте, _facelift, Вы писали:

_>У нас 0, и ошибка 997 (PENDING) — это значит все ОК. Я проверяю ошибки, но не в этом месте.

_>Типа 0 — не послали, а поставили в очередь.

Тогда у Вас вопрос, почему lpNumberOfBytesRecvd равны нулю?

Опять же из доков:

For connection-oriented sockets, WSARecv can indicate the graceful termination of the virtual circuit in one of two ways that depend on whether the socket is byte stream or message oriented. For byte streams, zero bytes having been read (as indicated by a zero return value to indicate success, and lpNumberOfBytesRecvd value of zero) indicates graceful closure and that no more bytes will ever be read.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.