我正在尝试编写与Bufferbloat项目相关的网络基准测试。其中大部分都有效,但我无法读取一个单字节的取消信号,该信号被发送到正在连续写入的套接字。
我的第一次尝试是这样的:
rv = send(sockfd, buffer, 65536, 0);
if(rv < 0) {
printf("Hard shutdown of spew()!\n");
goto bail;
}
if(recv(sockfd, &cancel, 1, MSG_DONTWAIT) == 1) {
// other end asking us to stop
cancel = 1;
}
Tcpdump显示客户端发送的单字节数据包,但服务器从未响应过它。奇怪的是,如果我然后手动终止客户端,服务器将响应取消数据包,而不会点击“硬关机”路径。
我的下一次迭代是使用poll():
if(!poll(&pfd, 1, 120000)) {
printf("Timeout in spew()!\n");
goto bail;
}
if(pfd.revents & (POLLOUT|POLLERR|POLLHUP)) {
rv = send(sockfd, buffer, 65536, 0);
if(rv < 0) {
printf("Hard shutdown of spew()!\n");
goto bail;
}
}
if(pfd.revents & POLLIN) {
if(recv(sockfd, &cancel, 1, MSG_WAITALL) == 1) {
// other end asking us to stop
cancel = 1;
}
}
这与早期的代码完全相同。
发生了什么,我该如何解决这个问题?
答案 0 :(得分:0)
事实证明原始代码确实有效。收到命令字节,退出循环后立即出现问题。这些症状被另一个因素搞糊涂了。