0

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

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

那么,鉴于我需要“接收方”上的端口 x 与“发送方”上的端口 y 通信,我该怎么做呢?

谢谢

4

3 回答 3

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传递给的参数sendto

于 2012-11-21T14:15:30.800 回答
0

如果这是一对一的映射,即一个源与一个目标通信,则只需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)

于 2012-11-21T14:47:15.353 回答
-1

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

于 2012-11-20T03:04:27.963 回答