socket编程中如何实现自动获取本机IP地址和随机获取一个没有占用的端口

本文介绍了socket编程中的基本概念,包括如何使用结构体sockaddr_in来指定socket的端点(IP+端口)。文中详细解释了服务器端如何绑定到本地IP地址进行监听,并说明了客户端如何连接到远程服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体:
struct sockaddr_in{
  short int sin_family;
  unsigned short int sin_port;
  struct in_addr sin_addr;
  char sin_zero[8];
};该结构体用于指定一个socket的一端【ip+port】

所以local.sin_addr.s_addr是ip地址。

//随机选择一个未被使用的端口号

my_addr.sin_port = 0;

//填入本机IP

my_addr.sin_addr = INADDR_ANY;


作为服务器,你要绑定【bind】到本地的IP地址上进行监听【listen】,但是你的机器上可能有多块网卡,也就有多个IP地址,这时候你要选择绑定在哪个IP上面,如果指定为INADDR_ANY,那么系统将绑定默认的网卡【即IP地址】。

作为客户端,你要连接【connect】到远端的服务器,也是要指定远端服务器的(ip, port)对。
当然,在这种情况下,不可能将IP地址指定为INADDR_ANY,系统会疯掉的。

在UDP(User Datagram Protocol,用户数据报协议)网络编程中,查询本地IP地址端口号通常涉及两个步骤:获取本地主机名然后转换为IP地址,以及查找可用的本地端口号。 1. **获取本地IP地址**: - 使用`gethostbyname`或其现代版本`getaddrinfo`函数可以获取本地主机名到IP地址的映射。例如,在C语言中: ```c struct addrinfo hints, *res; char host[] = "localhost"; int port; // 初始化hints结构体 memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // 不指定AF_INET 或 AF_INET6,默认两者都尝试 hints.ai_socktype = SOCK_DGRAM; // 设置为UDP if (getaddrinfo(host, NULL, &hints, &res) != 0) { perror("getaddrinfo error"); exit(1); } // 获取一个地址信息 char* ip_address = inet_ntoa(res->ai_addr); // 将struct in_addr转换为字符串 freeaddrinfo(res); printf("Local IP address: %s\n", ip_address); ``` 2. **查找本地端口号**: - UDP连接不需要预先绑定端口,但在实际应用中,你可能需要选择一个未使用的端口。你可以从特定范围(如1024~65535,取决于操作系统)随机选取,或者明确指定一个占用端口。在Windows上,可以使用`SOCKET`函数并设置`SO_REUSEADDR`标志来允许复用已关闭的端口。 ``` int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if (socket_fd < 0) { perror("Error creating socket"); } else { struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(your_random_or_free_port); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定端口 if (bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("Error binding socket"); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值