Порт к порту передачи данных с UDP

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

Я знаю, как это сделать, «получатель» устанавливает вызов recvfrom () с портом, который «отправитель» будет также использовать в команде sendto () … но он должен быть таким же порт.

Итак, учитывая, что мне нужен порт x на «получателе», чтобы общаться с портом y на «отправителе», как мне это сделать?

Спасибо

0

Решение

Вы можете определить порт источника при вызове bind на стороне отправителя. Например:

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) { /*error*/}

sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(source_port);  // here

int res = bind(sockfd,(struct sockaddr*)&sin, sizeof(sin));
if (res < 0) { /*error*/}

И порт назначения идет в sockaddr параметр передан sendto,

1

Другие решения

Если это взаимно-однозначное сопоставление, то есть один источник общается с одним пунктом назначения, то просто bind(2) местный порт и connect(2) на удаленный IP и порт (вопреки распространенному заблуждению вы Можно подключите сокеты UDP). Сделайте это с обеих сторон (с соответствующими удаленными и локальными IP-адресами / портами, конечно), и теперь вы можете просто использовать recv(2) а также send(2) без явной адресации.

Если одной стороне нужно подождать, пока другая отправит первый пакет, извлеките адрес / порт источника, полученный с recvfrom(2), а потом connect(2) к этому.

Если, с другой стороны, одна сторона действует как многопользовательский сервер, то сделайте то же самое bind(2)/connect(2) танцуй на клиенте, но только делай bind(2) в локальный порт, а затем использовать recvfrom(2)/sendto(2) на сервере.

0

Если вам нужна одновременная двусторонняя связь, тогда вы должны использовать сокеты в режиме блокировки — fcntl(...O_NONBLOCK...)и использовать select() чтобы определить, доступен ли ваш сокет для записи или чтения, или для того и другого. Вот хороший пример того, как это можно сделать http://www.lowtek.com/sockets/select.html

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector