[英]UDP Client Source port in C?
我正在编写一个 UDP 客户端,我需要在要发送的数据中提及我的 UDP 数据包的源端口。
我将非常感谢。 请尽快回复我。 我的项目此时已停止。
使用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);
或者,如果您正在与单个服务器通信,则可以在 UDP 套接字上使用connect
(这也为您提供了方便的副作用,即允许您使用send
而不是sendto
,并使 UDP 套接字仅接受来自“已连接”的数据报" peer),然后使用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);
您应该将您的套接字bind(2)
到您选择的端口。 另请参见man 7 ip
和man 7 udp
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.