Двухсторонний UDP-клиент и сервер? - PullRequest
1 голос
/ 18 октября 2011

Я пытаюсь реализовать базовый протокол передачи файлов, используя UDP.Я использую Beej's Guide в качестве ссылки, и большая часть кода, который я опубликую, оттуда.

В моей программе «говорящий» до сих пор отправляет имя нужного файла «получателю».

Оттуда получатель проверяет, существует ли файл, и, если это так, вычисляет размер файла.

Теперь я столкнулся с проблемами.Мне нужен приемник, чтобы отправить размер файла говорящему.Вы можете увидеть в моем коде (ссылки ниже), как я это реализовал.Тем не менее, говорящий просто зависает, как будто он все еще ждет, чтобы что-то было отправлено.

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

Может кто-нибудь сказать мне, какой код мне не хватает, или я неправильно использую функции?Трудно следовать руководству Биджа, и он не приводит пример двусторонней связи.

Спасибо, и дайте мне знать, если вам нужна дополнительная информация.


Слушатель: http://pastebin.com/UL1xjDnP

Говорящий: http://pastebin.com/B2zrXPgZ


РЕДАКТИРОВАТЬ: Решено!Благодаря cnicutar,

я обращался к серверу в этом коде, когда я должен был обратиться к клиенту

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, p->ai_addr, p->ai_addrlen)) == -1)

, который следует изменить на

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, (struct sockaddr *)&their_addr, &addr_len)) == -1)

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Вы не отправляете нужному пиру.Вы получаете p от getaddrinfo и затем отправляете на него.Итак, вы отправляете сообщение себе.

for(p = servinfo; p != NULL; p = p->ai_next)
/* .... */


numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
    (struct sockaddr *)&their_addr, &addr_len)) == -1)

/* .... */
if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0,
    p->ai_addr, p->ai_addrlen)) == -1)

Вы, вероятно, хотите отправить его "им":

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0,
    (struct sockaddr *)&their_addr, &addr_len)) == -1)
0 голосов
/ 18 октября 2011

Самое простое решение состоит в том, чтобы ваш «отправитель» прослушивал тот же порт / ip, который используется для отправки пакетов на сервер. Сервер может извлечь исходный IP / порт из заголовков пакетов и отправить туда свои ответы. Если вам нужно использовать разные порты / ips для ответов, тогда ваш «отправитель» должен будет включить эту информацию в то, что он отправляет. например "вот ваша информация, отправьте ответы на x.x.x.x: yyy"

...