LoliDeveloper
@LoliDeveloper
Линейная алгебра как смысл жизни

Почему UDP-клиенту на VirtualBox-Ubuntu не приходят датаграммы с UDP-сервера-Windows?

У меня клиент отправляет серверу датаграмму и ждёт ответ. Датаграмма доходит вообще отлично, но когда сервер отправляет знак что принял датаграмму, она не доходит до клиента. Клиент находится на VirtualBox-Ubuntu. Когда запускаю клиента и сервер на винде, то всё окей. Может здесь есть какая-то линуксовая тонкость? Вот как отправляю ответ обратно:
//приём датаграммы от клиента
int received = recvfrom(ls[i], datagram, sizeof(datagram), 
0, (struct sockaddr*) &addr, &addrlen); 
if (received > 0) {
    //отправка датаграммы, которая говорит что всё хорошо
    sendto(ls[i], datagram, 4, 0, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); 
    //получается что я отправляю на тот же addr. Когда я запускаю клиента на винде то всё хорошо
}


Через WireShark показывает что всё приходит в правильный порт и отправляется из правильного порта. Не понимаю окончательно в чём проблема
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
@Vindicar
while ((sel = select(s, &rfd, NULL, NULL, &time_val)) <= 0) {
                        res = sendto(s, dns_datagram, data_curlen, flags, (struct sockaddr*) &addr,
                                sizeof(struct sockaddr_in));
                        if (res < 0) {
                                printf("res = %d\nError. Server offline?\n", res);
                                printf("sel = %d\n", sel); // out 0
                        }
                        FD_ZERO(&rfd);
                        FD_SET(s, &rfd);
                }

Первое, почему условие <=0 а не ==0? Возврат -1 означает ошибку, и не должен проглатываться. Таймаут - это именно 0.
И я вижу косяк в первом аргументе у select.
nfds This argument should be set to the highest-numbered file
descriptor in any of the three sets, plus 1. The
indicated file descriptors in each set are checked, up to
this limit (but see BUGS).

Т.е. тебе нужно s+1 туда передать.

И да, MSDN пишет:
nfds Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.

Вот почему под виндой работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы