SO_REUSEADDR с UDP-датаграммами - ресурс недоступен - PullRequest
1 голос
/ 01 ноября 2010

Я использую опцию SO_REUSEADDR, но я не уверен, почему получаю Ресурс временно недоступен.

Я тестирую код клиентского сервера на 127.0.0.1

if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
{
    perror("socket() error!!\n");
    exit(1);
}

if ( setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) ) < 0 ) {
    perror("SO_REUSEADDR failed::");
    exit(1);
}

while(1) {

    nbytes_read = recvfrom(sockfd, (void *)&recvd_msg, sizeof(recvd_msg),
                           flags, &from, &from_len);
    printf("nbytes_read = %d\n", nbytes_read);
    if(nbytes_read == -1) {
        perror("client: recvfrom() failed");
        return FAILED;
    }
    if (nbytes_read > 0) {
        if(recvd_msg.hdr.msgtype == DATA)
            printf("recvd %d bytes from server\n", recvd_msg.hdr.payload_size);
            ftp_show_payload(&recvd_msg);
    }
    if(recvd_msg.hdr.is_last == TRUE) {
        break;
    }
}

Сообщение об ошибке: "client: recvfrom () не удалось: ресурс временно недоступен"

ERRNO: 11

После попытки запустить клиент 3-4 раза, я получаю данные, я не уверен, что происходит.

Кроме того, эта проблема возникает в Ubuntu Linux, но когда я запускаю тот же клиентский сервер в Solaris, работает отлично !!

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

SO_REUSEADDR полезно, когда вы используете bind(), но здесь вы не используете связывание.

Я не вижу никаких проблем, если recvfrom() возвращает -1

Используйте bind() и замените ваш звонок recvfrom() на recv(). recv() получит все пакеты через порт, который вы использовали при вызове bind.

0 голосов
/ 01 ноября 2010

Урезаете ли вы другие конфигурации сокетов? EAGAIN обычно возвращается, когда вы читаете неблокирующий сокет, и нет доступных данных. На странице man для recvfrom перечислены возможные ошибки, которые будут установлены при сбое, с объяснением для каждого из них.

0 голосов
/ 01 ноября 2010
  1. Ваш тест недействителен. recvfrom () может вернуть ноль, что не указывает на ошибку. Допустимо вызывать perror () только если вы получаете -1. Таким образом, у вас может вообще не быть проблем ..

  2. Я не понимаю, почему вы вообще используете SO_REUSEADDR, поскольку вы не привязываетесь к определенному порту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...