Golang预绑定端口规避端口抢占问题

本文档介绍了如何通过设置SO_REUSEADDR和SO_REUSEPORT套接字选项来预留和预绑定端口,避免客户端抢占本应属于服务器的端口。在Golang中,通过socket系统调用结合这两个参数,可以在不实际监听的情况下绑定端口,以备后续服务使用,同时避免Address in use错误。示例代码展示了获取本地IP和预绑定端口的实现。

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


0. 背景介绍

接上篇文章 记time_wait状态引起的端口占用排查 介绍的排查 time_wait 的方法,并不能从根本上解决客户端随机分配的端口抢占本应分配给服务器的端口的问题

1. 方案描述

一般在服务器上都存在一些需要预留的端口,除了上篇介绍的 net.ipv4.ip_local_port_range参数以外,没有很好的预留非连续端口的方式,只能提前绑定需要的端口

如果直接绑定或监听需要预分配的端口的话,当真正需要使用该端口时,还需要经历释放端口、重新绑定,并且还可能出现 Address is in use 的问题

解决方案是利用 SO_REUSEADDR和SO_REUSEPORT 参数的特性,在预绑定时设置这两个参数,后续再往该端口上绑定服务不会存在冲突,且客户端也无法进行抢占

2. 代码展示

  1. 根据网卡获取IP地址
    要选取正确的IP地址,否则绑定无效
func GetLocalIPByEthName(eth ...string) (string, error) {
   
	interfaces, err := net.Interfaces()
	if err != nil {
   
		return "", err
	}
	for _, i := 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值