Как я могу получить UDP-порт отправителя в C? - PullRequest
5 голосов
/ 31 марта 2009

У меня есть следующий типичный код в C под Linux для получения данных UDP:

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
mysock.sin_family = AF_INET;
mysock.sin_addr.s_addr = INADDR_ANY;
mysock.sin_port = my_port;
bind(sock, &mysock, sizeof(mysock);
recvfrom(sock, buf, PKTSZ, 0, &client, len);

Весь приведенный выше код работает, но теперь мне нужно выяснить порт udp отправителя, есть ли структура или системный вызов, который я могу использовать для получения такой информации при получении пакета udp?

спасибо

Ответы [ 5 ]

11 голосов
/ 31 марта 2009

recvfrom (sock, buf, PKTSZ, 0, & client, len);

Адрес сокета отправителя хранится в переменной client вашего кода. Для доступа к порту отправителя используйте sockaddr_in вместо sockaddr . Пример:

sockaddr_in client;
int len = sizeof(client);
recvfrom(sock, buf, PKTSZ, 0, (struct sockaddr *)&client, (socklen_t *)&len);
int port = ntohs(client.sin_port);

Ссылка: Руководство Beej по сетевому программированию и MSDN

6 голосов
/ 31 марта 2009

recvfrom () должен вернуть это вам в пятом аргументе (struct sockaddr *).

EDIT: Используйте что-то вроде этого

struct sockaddr_in client;

recvfrom(... (struct sockaddr*)&client ...);

client.sin_port должен быть портом отправителя.

1 голос
/ 31 марта 2009

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

0 голосов
/ 31 марта 2009

Преобразование клиента в sockaddr_in решает мою проблему.

0 голосов
/ 31 марта 2009

Пятый аргумент может быть приведен к struct sockaddr_in, а sin_port - это номер удаленного порта.

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