端口到端口使用UDP传输数据

时间:2012-11-20 02:34:08

标签: c++ sockets udp

我正在开发这个项目,其中指定了源端口和目标端口,用于通过C ++中的UDP套接字发送消息。我已经让项目的TCP部分工作正常,但我不明白在设置时如何指定源端口和目标端口。

我知道如何做的方式是“接收器”设置一个recvfrom()调用,“sender”也将在sendto()命令中使用的端口...但它需要是同一个港口。

所以,鉴于我需要“接收器”上的端口x与“发送者”上的端口y通信,我该怎么做?

由于

3 个答案:

答案 0 :(得分:1)

您可以在发件人方面调用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的{​​{1}}参数。

答案 1 :(得分:0)

如果这是一对一映射,即一个源与一个目的地通信,那么只需bind(2)本地端口和connect(2)到远程IP和端口(与常见的误解相反)< em>可以连接UDP套接字)。双方都这样做(当然使用适当的远程和本地IP /端口),现在您只需使用recv(2)send(2)而无需显式寻址。

如果一方需要等待另一方发送第一个数据包,则提取使用recvfrom(2)收到的源地址/端口,然后connect(2)

另一方面,如果一方充当多客户端服务器,那么在客户端上进行同样的bind(2) / connect(2)跳舞,但只能bind(2)到本地端口然后在服务器上使用recvfrom(2) / sendto(2)

答案 2 :(得分:-1)

如果需要同时进行双工通信,则应在阻塞模式下使用套接字 - fcntl(...O_NONBLOCK...),并使用select()确定套接字是可写还是可读或两者兼而有之。这是一个很好的例子,说明如何做到这一点http://www.lowtek.com/sockets/select.html