我正在通过 udp 编写客户端-服务器应用程序。我做了这些步骤:
memset((void *)&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(serverport);
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) < 0)
err_func("Error in inet_pton()\n");
...
if( (socketfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
err_func("Error in socket()");
...
if(sendto(socketfd,&pckt, sizeof(pckt), 0, (struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
err_func("Error in sendto()\n");
...
struct sockaddr_in addr;
socklen_t len;
if(getsockname(socketfd,(struct sockaddr *) &addr, &len) != 0)
err_func("Error in getsockname()\n");
printf("My port is %d\n", addr.sin_port);
现在我的问题是这段代码会打印“我的端口是 0”,但是为什么呢?这怎么可能?(0 是一个快乐的意思是“SO 将随机分配一个未使用的端口”,但是在发送到 SO 已经为我的套接字分配了一个端口之后,或者没有?)
奇怪的是,在 2 或 3 次 sendto 之后,我的代码开始为 addr.sin_port 打印不同的值。为什么自从第一次发送后它就不能正常工作?
我需要它绑定一个端口,因为在服务器上我创建了一个与该客户端地址执行连接的进程,他将接收来自客户端的所有数据包。
我尝试在运行第一个 sendto 之前对客户端运行绑定,但似乎绑定没有效果(可能我在绑定中使用的 struct sockaddr_in 填写错误?我不知道)。
如果您需要,我可以发布运行 main 中的所有代码...我提前发送第一个数据包...