Я работаю над этим проектом, где указаны порты источника и назначения для отправки сообщения через UDP-сокет в C ++. У меня TCP часть проекта работает нормально, но я не понимаю, как указать порты источника и назначения при настройке.
Я знаю, как это сделать, «получатель» устанавливает вызов recvfrom () с портом, который «отправитель» будет также использовать в команде sendto () … но он должен быть таким же порт.
Итак, учитывая, что мне нужен порт x на «получателе», чтобы общаться с портом y на «отправителе», как мне это сделать?
Спасибо
Вы можете определить порт источника при вызове 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
,
Если это взаимно-однозначное сопоставление, то есть один источник общается с одним пунктом назначения, то просто 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)
на сервере.
Если вам нужна одновременная двусторонняя связь, тогда вы должны использовать сокеты в режиме блокировки — fcntl(...O_NONBLOCK...)
и использовать select()
чтобы определить, доступен ли ваш сокет для записи или чтения, или для того и другого. Вот хороший пример того, как это можно сделать http://www.lowtek.com/sockets/select.html