UDP-порт источника клиента в C? - PullRequest
6 голосов
/ 12 июля 2011

Я пишу UDP-клиент, и мне нужно указать исходный порт моего UDP-пакета в моих данных для отправки.

  1. Как моя программа может получить случайный номер порта, сгенерированный kernal, который использует клиент udp для отправки данных на сервер voip.так
  2. Как мне указать конкретный порт источника UDP перед отправкой данных.

Я буду очень, очень благодарен.Пожалуйста, ответьте мне как можно скорее.Мой проект остановлен на этом этапе.

Ответы [ 2 ]

7 голосов
/ 12 июля 2011

Используйте bind для привязки вашего сокета к порту 0, что позволит вам использовать getsockname для получения порта. Вы также можете привязать свой сокет к определенному порту, если хотите.

например (при условии сокета IPv4, без проверки ошибок):

struct sockaddr_in sin = {};
socklen_t slen;
int sock;
short unsigned int port;

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = 0;

bind(sock, (struct sockaddr *)&sin, sizeof(sin));
/* Now bound, get the address */
slen = sizeof(sin);
getsockname(sock, (struct sockaddr *)&sin, &slen);
port = ntohs(sin.sin_port);

В качестве альтернативы, если вы общаетесь с одним сервером, вы можете использовать connect на своем сокете UDP (что также дает вам удобный побочный эффект: вы можете использовать send вместо sendto и сделать Сокет UDP принимает дейтаграммы только от вашего «подключенного» партнера), затем используйте getsockname для получения вашего локального порта / адреса. Вы все еще можете связать свой сокет до использования connect.

например:

struct sockaddr_in sin = {};
socklen_t slen;
int sock;
short unsigned int port;

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
/* set sin to your target host... */
...
connect(sock, (struct sockaddr *)&sin, sizeof(sin));
/* now retrieve the address as before */
slen = sizeof(sin);
getsockname(sock, (struct sockaddr *)&sin, &slen);
port = ntohs(sin.sin_port);
2 голосов
/ 12 июля 2011

Вы должны bind(2) свой сокет к порту по вашему выбору.Смотрите также man 7 ip и man 7 udp.

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