Проблема с получением UDP-сообщения от сервера - PullRequest
0 голосов
/ 02 марта 2010

Мне нужно подключиться к удаленному серверу по протоколу UDP и отправить ему заранее определенное сообщение, чтобы получить сообщение обратно. Сначала я попробовал это в TCP, и это работало, но в UDP после того, как я отправил сообщение и прослушал ответ в recvfrom (), я ничего не получил. Может кто-нибудь сказать мне, в чем может быть проблема здесь.

if ((bytes_sent = sendto(sockfd, UDP_MSG, strlen(UDP_MSG), 0, p->ai_addr, p->ai_addrlen)) == -1) {
            perror("ClientUDP: Error sending data");
            exit(1);
        }

printf("Data sent %s\n", UDP_MSG);  

len = sizeof(struct sockaddr_storage);

if ((bytes_recv = recvfrom(sockfd, bufudp, MAXDATASIZE-1, 0,(struct sockaddr*)&addr, &len)) == -1) {
            perror("Error receiving in UDP");
            exit(1);
        }



printf("Bytes recv %d\n", bytes_recv);  

bufudp[bytes_recv] = '\0';
printf("ClientUDP: Received\n %s \n",bufudp );   

Порт вводится с клавиатуры с помощью scanf (), а сообщение представляет собой строку «HI».

Ответы [ 2 ]

1 голос
/ 02 марта 2010

TCP и UDP не являются взаимозаменяемыми. Некоторые конкретные протоколы используют оба (например, DNS), но большинство из них выбирают один или другой. HTTP (S) построен поверх TCP, так как для него требуется двунаправленный поток. Многие аудио / видео протоколы построены поверх UDP, поскольку пропущенные / переупорядоченные пакеты (время от времени) не являются критическими.

Короче говоря, ваш сервер, вероятно, прослушивает только TCP-порт, а не UDP.

Если вы знаете , что сервер прослушивает как TCP, так и UDP, проверьте брандмауэры на обеих машинах и вдоль маршрута.

0 голосов
/ 03 марта 2010

Если вы хотите увидеть, выходит ли пакет UDP с вашего компьютера с правильным содержимым и адресами, которые вы ожидаете, я бы установил Wireshark. Эта утилита будет захватывать и декодировать все IP-пакеты, отправленные / полученные вашим компьютером.

Один вопрос, recvfrom () сразу возвращается или просто блокируется? Если он вернется немедленно, я проверю, является ли возвращаемое значение -1, если это так, это указывает на наличие кода ошибки в errno.

...