2016-12-25 4 views
-1

Ich möchte Daten von einem Socket empfangen, ohne einen Puffer anzugeben. Also möchte ich nur x Bytes aus dem eingehenden Datenpuffer entfernen.WinSock: Daten aus Socket entfernen

Ich habe den folgenden Code (gekürzt):

recv(gSocket, NULL, userDataLength, 0); 

Aber wenn ich den Code über dem Rückgabewert von recv() ist SOCKET_ERROR und WSAGetLastError() kehrt WSAECONNABORTED auszuführen. Außerdem wird meine Verbindung geschlossen.

Frage: Ist es nicht möglich, die Empfangsfunktion zum Entfernen von Daten aus dem RX-Puffer der Steckdose zu verwenden?

+0

Wo es nicht sagen, dass der Pufferzeiger null sein kann? – EJP

+0

Nirgendwo. Aber ich dachte, es ist möglich, weil es auf anderen Socket-Bibliotheken möglich ist. –

+1

Ich kenne keine solchen Bibliotheken, aber in jedem Fall ist das ein * nicht sequitur. * – EJP

Antwort

2

Ich möchte Daten von einem Socket empfangen, ohne einen Puffer anzugeben.

Sorry, aber das ist einfach nicht möglich. Sie müssen einen Puffer bereitstellen, um die Bytes zu empfangen. Wenn Sie die Bytes nicht verwenden möchten, verwerfen Sie einfach den Puffer, nachdem Sie ihn eingelesen haben.

Ich möchte nur x Bytes aus dem eingehenden Datenpuffer entfernen.

Es gibt keine API dafür. Sie müssen die Bytes in einen gültigen Puffer lesen. Was Sie danach mit diesem Puffer tun, liegt an Ihnen.

, wenn ich den Code über dem Rückgabewert von recv() ausführen SOCKET_ERROR und WSAGetLastError() kehrt WSAECONNABORTED ist.

Ich hätte stattdessen WSAEFAULT erwartet.

Ist es nicht möglich, die Empfangsfunktion zum Entfernen von Daten aus dem RX-Puffer der Buchse zu verwenden?

Sicher ist es möglich. Sie müssen einfach nur die Bytes in einen Puffer lesen, auch wenn es nur ein temporärer Puffer, zB:

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

Danke für die Antwort. Ich habe meine eigene Funktion zum Entfernen/Ignorieren von Bytes geschrieben (ähnlich wie bei Ihrem Code). –