Как получить UDP-порт отправителя в C?

У меня есть следующий типичный код на 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?

Спасибо


c udp
person Community    schedule 31.03.2009    source источник


Ответы (6)


recvfrom(sock, buf, ПКТСЗ, 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

person Community    schedule 31.03.2009
comment
reinterpret_cast здесь неуместен. ОП запросил C (не C++) - person sigjuice; 31.03.2009

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

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

struct sockaddr_in client;

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

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

person sigjuice    schedule 31.03.2009
comment
Я рассматривал этот аргумент ранее, но структура sockaddr не содержит информации о порте udp отправителя, если только она не встроена в файл sa_data. - person ; 31.03.2009

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

person Indy9000    schedule 31.03.2009
comment
Возможно, я неясно выразился, мне нужно знать порт udp отправителя, чтобы я мог немедленно отправить данные обратно, так что это нормально, чтобы быть временным. - person ; 31.03.2009
comment
вы можете отправлять данные обратно только в прослушиваемый сокет udp. Маловероятно, что ваш сокет-отправитель также является сокетом для прослушивания. Если вам нужно такое поведение, вам нужно прослушивать сокеты udp с обеих сторон. - person Indy9000; 31.03.2009

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

person E Dominique    schedule 31.03.2009

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

person Community    schedule 31.03.2009

Да! Прежде всего помните о ntohs()! Только когда я использовал калькулятор программиста, я понял, что он БЫЛ сохранен как BigEndian 15B3, а не предположительно эфемерный порт B315!

person Jerry Miller    schedule 24.10.2019