You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于`man addrinfo`中UDP示例服务器运行异常及端口复用的问题咨询

问题分析与解决方案

咱们一步步拆解你遇到的几个问题:

1. 大部分端口连接无反应,仅8000端口偶尔工作

核心原因是netcat默认使用TCP协议,而你的服务器是UDP类型,两者协议不兼容:

  • 当你直接运行netcat 127.0.0.1 9001时,netcat会尝试和目标端口建立TCP连接,但UDP服务器根本不会处理TCP的连接请求(SYN包),所以netcat会一直卡在连接尝试状态,既无输出也无错误。
  • 那次8000端口的成功,大概率是你之前误启动了TCP服务器,或者巧合下用了UDP模式的netcat却没记录下来。

解决方法:
连接UDP服务器时,必须给netcat加上-u参数指定UDP模式:

netcat -u 127.0.0.1 9001

这样就能正常和UDP服务器交互了。

2. 服务器终端未打印接收的消息

man addrinfo里的UDP示例代码只实现了消息回显逻辑——收到数据后直接发回客户端,但没有添加打印接收内容的代码。

解决方法:
修改服务器代码,在recvfrom成功接收数据后,添加打印语句。比如在收到数据后加上:

printf("Received message: %.*s\n", nbytes, buf);

(用%.*s可以避免因buf未以null结尾导致的越界问题,nbytes是recvfrom返回的实际接收字节数)

3. 停止服务器后无法复用同一端口

这是因为默认情况下,操作系统会保留关闭的套接字端口一段时间(即使是UDP端口),防止旧数据包干扰新连接。如果你的服务器代码没有设置SO_REUSEADDR套接字选项,就无法立即重新绑定同一端口。

解决方法:
在调用bind()之前,设置套接字的SO_REUSEADDR选项:

int optval = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) {
    perror("setsockopt");
    exit(EXIT_FAILURE);
}

这样就能在停止服务器后,立即重新启动并绑定同一端口了。


内容的提问来源于stack exchange,提问作者Jsevillamol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:30:38