poll () не помечает читаемые данные - PullRequest
1 голос
/ 18 марта 2011

Я пытаюсь написать сетевой тест, связанный с проектом 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;
    }
}

Это ведет себя так же, как в предыдущем коде.

Что происходит и как я могу это исправить?

1 Ответ

0 голосов
/ 18 марта 2011

Оказывается, что оригинальный код действительно работает. Получен командный байт, и проблема возникает сразу после выхода из цикла. Симптомы были спутаны другим фактором.

...