使用数据报或原始套接字提高winsock性能

时间:2016-06-04 04:12:00

标签: c++ sockets winsock

我遇到以下任务的问题,我需要从服务器接收一些数据,直到我遇到一组特定的规则(使用c ++正则表达式检查它们)。目前我正在使用一个简单的winsock套接字

ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
do {

    bytes = recv(ClientSocket, buffer, LENGTH, 0);
    if ( bytes > 0 ) {
        //regex checks
         .....
        /* if regex checks are passed i need to close the connection: */
        closesocket(ClientSocket);
        break;
    }

} while( bytes > 0 );

问题是,因为套接字是一个流套接字,据我所知,可能会有额外的数据到达并将被windows core tcp / ip驱动程序存储在某个低级缓冲区中,我不会# 39;我需要处理,而且我不需要处理。我的目标是通过数据包接收数据,通过正则表达式检查匹配规则的数据,然后关闭连接,以避免Windows驱动程序接收额外的低级数据。基本上我想获得更高的性能,只需在我实现输入数据所需的时候断开连接。所以我想使用一种数据报包。所以问题是它会提高性能吗?并且唯一的选择是使用带有tcp实现的原始套接字吗?或者也许我可以在winsock中使用带有tcp套接字的datagran?

修改 我的意思是简短的话:

SOCK_STREAM是否使Windows tcp / ip驱动程序从内部缓冲区中的服务器接收数据,即使我没有使用recv请求它,如果是SOCK_RAW也是如此会是选择吗?

1 个答案:

答案 0 :(得分:0)

SOCK_STREAM是一种基于流的通信,就像文件一样。上层应用程序需要知道如何将这些流作为结构化数据。

如果可能的话,你可以尝试SOCK_DGRAM,这是基于数据包的,所以如果你收到一个数据包,包括所有数据信息作为一个结构,你只需处理整个数据包。