我遇到了以下任务的问题,我需要从服务器接收一些数据,直到我遇到一组特定的规则(通过使用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驱动程序存储在某个低级缓冲区中,我不需要过程,我不需要处理 . 我的目标是通过数据包接收数据,通过正则表达式检查匹配规则的数据,然后关闭连接,以避免Windows驱动程序接收额外的低级数据 . 基本上我想获得更高的性能,只需在我实现输入数据所需的时候断开连接 . 所以我想使用一种数据报包 . 所以问题是它会提高性能吗?并且唯一的选择是使用带有tcp实现的原始套接字吗?或者也许我可以在winsock中使用带有tcp套接字的datagran?
EDIT: 我的意思是简短的说法:
SOCK_STREAM
使windows tcp / ip驱动程序从内部缓冲区中的服务器接收数据,即使我没有用 recv
请求它,如果是这样, SOCK_RAW
将是选择吗?
1 回答
SOCK_STREAM是一种基于流的通信,就像文件一样 . 上层应用程序需要知道如何将这些流作为结构化数据 .
也许你可以尝试SOCK_DGRAM,如果可能的话,这是基于数据包,所以如果你收到一个数据包,包括所有数据信息作为一个结构,你只需处理整个数据包 .