2010-03-02 1 views
0

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

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».

+1

Вы уверены, что сервер работает в обоих протоколах? Вы контролируете сервер? Если да, можете ли вы сказать, даже если сообщение приходит на сервер в первую очередь? –

+0

Нет, я не контролирую сервер, но поддерживает UDP. Единственная константа в номере порта. Есть ли способ для меня убедиться, что сообщение правильно отправлено с моей стороны? – sfactor

+1

Создайте * подключенный * UDP-сокет - таким образом, если ОС получит ICMP-Port-Unreachable, вы получите ошибку при приеме (но не при отправке.) –

ответ

1

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

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

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

+0

хорошо все должно работать, и нет проблем с брандмауэром. дело в том, что если я отправлю точное сообщение по данному номеру порта, я получу какой-либо сообщение с сервера. есть ли какая-нибудь другая вещь, которая может пойти не так, как буферы msg или что-нибудь? – sfactor

+0

Да, с UDP многие вещи могут пойти не так - поскольку в самом UDP нет гарантии - любой узел маршрута, включая источник и пункт назначения, может просто удалить дейтаграмму; буфер приема сокета сервера может быть заполнен (опять же, в результате удаляется датаграмма). Но похоже, что ваша проблема, скорее всего, неправильного формата сообщения. Является ли сервер встроенной системой (например, такими небольшими беспроводными маршрутизаторами)? Тогда это может быть другой * endianness *. Вам действительно нужно изучить протокол приложения, чтобы понять, что там не так. –

0

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

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

+0

Да, я проверю использование wirehark, thanx для предложения. в отношении вашего вопроса он в основном он просто блокирует. – sfactor

 Смежные вопросы

  • Нет связанных вопросов^_^