Программирование сокетов на C - PullRequest
4 голосов
/ 21 января 2009

Хорошо, поэтому я пытаюсь заставить работать некоторый UDP-код, и я не очень хорошо разбираюсь в сетевом программировании с использованием C. Я использую файл примера из здесь

По сути, я просто слушаю входящие UDP-пакеты на заданном порту, а затем хочу отправить некоторые данные таким же образом. Ниже приведена соответствующая часть.

На этом этапе сокет настроен и привязан к выбранному порту и ожидает входящие пакеты:

printf("GSProxy: waiting to recvfrom...\n");

addr_len = (socklen_t) sizeof their_addr;
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
    (struct sockaddr *)&their_addr, &addr_len)) == -1) { // argument 6 gives a warning but is correct int
    perror("recvfrom");
    exit(1);
}

printf("GSProxy: got packet from %s\n", 
inet_ntop(their_addr.ss_family, 
    get_in_addr((struct sockaddr *)&their_addr), s, sizeof s));
printf("GSProxy: packet is %d bytes long\n", numbytes);
buf[numbytes] = '\0';
printf("GSProxy: packet contains \"%s\"\n", buf);

char retmsg[] = "Hello!";
if ((numbytes = sendto(sockfd, retmsg, 7, 0, 
    (struct sockaddr *) &their_addr, &addr_len)) == -1) {
    perror("GSPProxy: sendto");
    exit(1);
}

printf("GSProxy: Sent %i bytes.\n", numbytes);

Я просто хочу отправить "Привет!" Строка обратно к отправителю.

Сбой при ошибке "GSPProxy: sendto: File name too long". Какой код ошибки [ENAMETOOLONG], насколько я могу судить.

Но ... что ** это значит? Какой файл? Что слишком долго?

Неужели я не могу повторно использовать сокет для отправки данных назад, или я просто сделал еще одну ошибку новичка?

С уважением,

Ответы [ 2 ]

14 голосов
/ 21 января 2009

Не следует передавать адрес длины структуры сокета в sendto() - для этого требуется фактическая длина (т. Е. "addr_len", а не "&addr_len").

Причина, по которой вы передаете адрес длины в recvfrom(), заключается в том, что он изменяется этой функцией, если реальный адрес оказывается короче.

Другими словами, заменить:

if ((numbytes = sendto (sockfd, retmsg, 7, 0,
    (struct sockaddr *) &their_addr, &addr_len)) == -1) {

с:

if ((numbytes = sendto (sockfd, retmsg, 7, 0,
    (struct sockaddr *) &their_addr, addr_len)) == -1) {
1 голос
/ 21 января 2009

Эмм, как минимум '& addr_len', который вы передали в sendto, вероятно, не должен был быть передан по адресу: то есть: должен был быть только addr_len.

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