Я пытаюсь написать сетевой тест, связанный с проектом 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;
}
}
Это ведет себя так же, как в предыдущем коде.
Что происходит и как я могу это исправить?