2016-12-25 8 views
-1

Я хочу получать данные из сокета без указания буфера. Поэтому я просто хочу удалить x байтов из буфера входящих данных.WinSock: удалить данные из сокета

У меня есть следующий код (усеченный):

recv(gSocket, NULL, userDataLength, 0); 

Но когда я выполняю код выше возвращаемого значения recv() является SOCKET_ERROR и WSAGetLastError() возвращается WSAECONNABORTED. Кроме того, моя связь закрыта.

Вопрос: Невозможно ли использовать функцию приема для удаления данных из буфера RX сокета?

+0

Где это говорит о том, что указатель буфера может быть пустым? – EJP

+0

Нигде. Но я думал, что это возможно, потому что это возможно в других библиотеках сокетов. –

+1

Я не знаю таких библиотек, но в любом случае это * non sequitur. * – EJP

ответ

2

Я хочу получать данные из сокета без указания буфера.

Извините, но это просто невозможно. Вы должны предоставить буфер для приема байтов. Если вы не хотите использовать байты, просто отбросьте буфер после того, как вы его прочитали.

Я просто хочу удалить x байтов из буфера входящих данных.

Для этого нет API. Вы должны прочитать байты в действительном буфере. То, что вы делаете с этим буфером, зависит от вас.

, когда я выполняю код выше возвращаемого значения recv() является SOCKET_ERROR и WSAGetLastError() возвращается WSAECONNABORTED.

Я бы предпочел WSAEFAULT.

Невозможно ли использовать функцию приема для удаления данных из буфера RX сокета?

Несомненно, это возможно. Вы просто должны прочитать байты в буфер, даже если это всего лишь временный буфер, например:

int ignoreBytes(SOCKET sock, int numBytes) 
{ 
    u_char buf[256]; 
    while (numBytes > 0) 
    { 
     int numRead = recv(sock, (char*)buf, min(sizeof(buf), numBytes), 0); 
     if (numRead <= 0) 
      return numRead; 
     numBytes -= numRead; 
    } 
    return 1; 
} 

ignoreBytes(gSocket, userDataLength); 
+0

Спасибо за ответ. Я написал свою собственную функцию для удаления/игнорирования байтов (аналогично вашему коду). –

 Смежные вопросы

  • Нет связанных вопросов^_^