WinSock:从套接字中删除数据

时间:2016-12-25 14:52:58

标签: c++ winsock2

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

我有以下代码(截断):

recv(gSocket, NULL, userDataLength, 0);

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

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

1 个答案:

答案 0 :(得分: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);