我正在尝试编写与 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;
}
}
这与早期代码的行为相同。
发生了什么事,我该如何解决?