2016-12-25 35 views
-1

我想在不指定缓冲区的情况下从套接字接收数据。所以我只想从传入的数据缓冲区中移除x个字节。WinSock:从套接字中删除数据

我有以下代码(截断):

recv(gSocket, NULL, userDataLength, 0); 

但是,当我执行的recv()返回值上面的代码是SOCKET_ERRORWSAGetLastError()返回WSAECONNABORTED。此外,我的连接被关闭。

问题:使用receive函数从套接字的RX缓冲区中删除数据是不可能的?

+0

它在哪里说,缓冲区指针可以为空? – EJP

+0

不通。但我认为这是可能的,因为它可能在其他套接字库上。 –

+1

我不知道任何这样的库,但在任何情况下,这是一个* non sequitur。* – EJP

回答

2

我想在不指定缓冲区的情况下从套接字接收数据。

对不起,但那根本不可能。您必须提供一个缓冲区来接收字节。如果您不想使用这些字节,只需在读入缓冲区后放弃该缓冲区即可。

我只是想从传入的数据缓冲区中删除x个字节。

这没有API。您必须将字节读入有效的缓冲区。你以后用这个缓冲区做什么取决于你。

当我执行的 recv()返回值上面的代码是 SOCKET_ERRORWSAGetLastError()返回 WSAECONNABORTED

我会预期WSAEFAULT来代替。

使用receive函数从套接字的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

感谢您的答案。我写了自己的函数来删除/忽略字节(类似于您的代码)。 –