我想在不指定缓冲区的情况下从套接字接收数据。所以我只想从传入的数据缓冲区中移除x个字节。WinSock:从套接字中删除数据
我有以下代码(截断):
recv(gSocket, NULL, userDataLength, 0);
但是,当我执行的recv()
返回值上面的代码是SOCKET_ERROR
和WSAGetLastError()
返回WSAECONNABORTED
。此外,我的连接被关闭。
问题:使用receive函数从套接字的RX缓冲区中删除数据是不可能的?
我想在不指定缓冲区的情况下从套接字接收数据。所以我只想从传入的数据缓冲区中移除x个字节。WinSock:从套接字中删除数据
我有以下代码(截断):
recv(gSocket, NULL, userDataLength, 0);
但是,当我执行的recv()
返回值上面的代码是SOCKET_ERROR
和WSAGetLastError()
返回WSAECONNABORTED
。此外,我的连接被关闭。
问题:使用receive函数从套接字的RX缓冲区中删除数据是不可能的?
我想在不指定缓冲区的情况下从套接字接收数据。
对不起,但那根本不可能。您必须提供一个缓冲区来接收字节。如果您不想使用这些字节,只需在读入缓冲区后放弃该缓冲区即可。
我只是想从传入的数据缓冲区中删除x个字节。
这没有API。您必须将字节读入有效的缓冲区。你以后用这个缓冲区做什么取决于你。
当我执行的recv()
返回值上面的代码是SOCKET_ERROR
和WSAGetLastError()
返回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);
感谢您的答案。我写了自己的函数来删除/忽略字节(类似于您的代码)。 –
它在哪里说,缓冲区指针可以为空? – EJP
不通。但我认为这是可能的,因为它可能在其他套接字库上。 –
我不知道任何这样的库,但在任何情况下,这是一个* non sequitur。* – EJP