我遇到以下任务的问题,我需要从服务器接收一些数据,直到我遇到一组特定的规则(使用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
也是如此会是选择吗?
答案 0 :(得分:0)
SOCK_STREAM是一种基于流的通信,就像文件一样。上层应用程序需要知道如何将这些流作为结构化数据。
如果可能的话,你可以尝试SOCK_DGRAM,这是基于数据包的,所以如果你收到一个数据包,包括所有数据信息作为一个结构,你只需处理整个数据包。