首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于socket的SO_REUSEADDR在golang中不能很好地工作吗?

SO_REUSEADDR是一个socket选项,用于允许在同一端口上快速重用处于TIME_WAIT状态的socket。在golang中,SO_REUSEADDR选项是默认启用的,因此可以很好地工作。

SO_REUSEADDR的作用是允许一个socket绑定到一个已经被使用的地址,只要该地址处于TIME_WAIT状态。这在服务器程序中特别有用,因为服务器程序经常需要在关闭后立即重新启动。通过设置SO_REUSEADDR选项,服务器程序可以立即重新绑定到相同的地址和端口,而无需等待TIME_WAIT状态的socket完全释放。

在golang中,可以通过设置net包中的ListenConfig结构体的属性来启用SO_REUSEADDR选项。具体代码如下:

代码语言:txt
复制
package main

import (
    "fmt"
    "net"
)

func main() {
    lc := net.ListenConfig{
        Control: func(network, address string, c syscall.RawConn) error {
            return c.Control(func(fd uintptr) {
                syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
            })
        },
    }

    ln, err := lc.Listen(context.Background(), "tcp", ":8080")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // 后续处理逻辑...
}

在上述代码中,通过设置ListenConfig的Control属性,可以在创建监听器时设置SO_REUSEADDR选项。这样,即使之前的socket处于TIME_WAIT状态,也可以立即重新绑定到相同的地址和端口。

总结:在golang中,SO_REUSEADDR选项是默认启用的,可以很好地工作。通过设置net包中的ListenConfig结构体的属性,可以在创建监听器时启用SO_REUSEADDR选项。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

套接字SO_REUSEPORT和SO_REUSEADDR区别

其另一作用也是为什么大家进行服务器端编程时候会采用SO_REUSEADDR选项原因。为了理解其另一个作用及其重要应用,我们需要先更深入讨论一下TCP协议工作原理。...因为优雅关闭TCP socket是一个比较复杂过程,过程包括与远程主机交换数个数据包(包括丢包情况下丢失重传),而这个数据包交换过程所需要时间也包括延迟时间中。...但需要注意是,某些时候,将一个新socket绑定在一个处于TIME_WAIT阶段但仍在工作socket所对应地址端口对会产生一些我们并不想要,无法预料负面影响。...最后,关于SO_REUSEADDR,我们还要注意一件事是,以上所有内容只要我们对新socket设置了SO_REUSEADDR就成立。...Windows对一个socket设置SO_REUSEADDR效果与BSD下同时对一个socket设置SO_REUSEPORT和SO_REUSEADDR相同。

3.1K20

告知你不为人知 UDP:连接性和负载均衡

引言 作为文章”《从TCP三次握手说起 : 浅析TCP协议疑难杂症》”姊妹篇,很早就计划写篇关于UDP文章,尽管UDP协议远没TCP协议那么庞大、复杂,但是,要想将UDP描述清楚,用好UDP却要比...然而对于UDP却无法很好采用PMP机制,由于UDP无连接性、无序性,它没有通信对端信息,不知道一个数据包前置和后续,它没有很好办法知道,还有没后续数据包以及如果有的话,过多久才会来,会来多久...会接收到数据,其它都是默默等待,孤独等待永远也收不到UDP数据。...于是基本解决方案是整个服务过程不能关闭UDP socket(当然也可以全部UDP socket都close掉,从新创建一批新)。...由于内核查找算法是固定,于是,无形中所有的client被划分为8类,类型1所有client请求全部被路由到工作进程1UDP socket工作进程1来处理,同样类型2client请求也全部被工作进程

15.9K143

记time_wait状态引起端口占用排查

问题背景 Liunx服务器上发现有 10倍于 LISTEN 服务 time_wait 状态,服务并非高并发,日常连接数也比较少,因此该现象明显异常 1....问题定位 time_wait状态 回顾下 time_wait 状态处于 TCP 通信哪个阶段: TCP四次挥手过程,主动断开连接一方会在发送完最后一个 ACK 包后,等待 2MSL(Maximum...-52000 sysctl -p SO_REUSEADDR和SO_REUSEPORT 关于这两个参数概念理解并不是本篇重点,大家可以参考SO_REUSEADDR和SO_REUSEPORT作用这篇博文解释..."golang.org/x/sys/unix" ) if fd, err := syscall.Socket(syscall.AF_INET, syscall.O_NONBLOCK|syscall.SOCK_STREAM...,下一篇会总结当服务端口频繁被其他随机分配端口占用情况下,可以如何通过 Golang或其他代码来解决

1.1K40

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

背景介绍 接上篇文章 记time_wait状态引起端口占用排查 介绍排查 time_wait 方法,并不能从根本上解决客户端随机分配端口抢占本应分配给服务器端口问题 1....方案描述 一般服务器上都存在一些需要预留端口,除了上篇介绍 net.ipv4.ip_local_port_range参数以外,没有很好预留非连续端口方式,只能提前绑定需要端口 如果直接绑定或监听需要预分配端口的话...,当真正需要使用该端口时,还需要经历释放端口、重新绑定,并且还可能出现 Address is in use 问题 解决方案是利用 SO_REUSEADDR和SO_REUSEPORT 参数特性,预绑定时设置这两个参数...*net.IPNet); ok { return n.IP.String(), nil } } } } } return "", nil } 绑定端口 Golang...包含 syscall包,可以调用系统函数。

1.3K30

怎么测试Linux下tcp最大连接数限制详解

前言 关于TCP服务器最大并发连接数有一种误解就是“因为端口号上限为65535,所以TCP服务器理论上可承载最大并发连接数也是65535”。..., SO_REUSEADDR, &optval, optlen); } int main() { int fd = socket(AF_INET, SOCK_STREAM, 0); int iRet...然后首先想到是ulimit -n限制,查看了一下,默认值1024,然后就是修改这个值,/etc/security/limits.conf添加一下内容: 1 * soft nofile 102400...连接数还在增加,不知道能不能最终达到10万呢,小小期待ing 时间:2017-12-31 00:41:00,最终上限卡在28232,golang一直报dial失败,由于忘了打印出具体错误信息了,所以无从知道为什么...golang标准库文档么有对错误信息解释,从错误信息来看,是分配地址失败,于是想是不是端口地址范围限制了。 ?

4.4K41

如何测试Linux下tcp最大连接数限制详解

前言 关于TCP服务器最大并发连接数有一种误解就是“因为端口号上限为65535,所以TCP服务器理论上可承载最大并发连接数也是65535”。..., SO_REUSEADDR, &optval, optlen); } int main() { int fd = socket(AF_INET, SOCK_STREAM, 0); int iRet...然后首先想到是ulimit -n限制,查看了一下,默认值1024,然后就是修改这个值,/etc/security/limits.conf添加一下内容: 1 * soft nofile 102400...连接数还在增加,不知道能不能最终达到10万呢,小小期待ing 时间:2017-12-31 00:41:00,最终上限卡在28232,golang一直报dial失败,由于忘了打印出具体错误信息了,所以无从知道为什么...golang标准库文档么有对错误信息解释,从错误信息来看,是分配地址失败,于是想是不是端口地址范围限制了。 ?

5.7K41

提高服务端性能几个socket选项

提高服务端性能几个socket选项 之前一篇文章,作者配置了SO_REUSEPORT选项之后,使得应用性能提高了数十倍。...现在介绍socket选项如下几个可以提升服务端性能选项: SO_REUSEADDR SO_REUSEPORT SO_ATTACH_REUSEPORT_CBPF/EBPF 验证环境:OS:centos...如果一个socket绑定到了0.0.0.0:21,则表示该socket绑定了所有现有的本地地址,此时,其他socket不能绑定到任何本地地址21端口上。...启用SO_REUSEADDR 选项后,例1bind前添加如下代码,然后运行,此时不会再报错: int optval = 1; setsockopt(lfd, SOL_SOCKET,...提高UDP交互性能一文,提高流量一个方式就是使用BPF程序将socket与CPU核关联起来,实际就是将一个socket与这个核上流进行了关联,防止因为哈希算法导致多条流争用同一个socket导致性能下降

1.4K20

字节一面:TCP 和 UDP 可以使用同一个端口

关于端口知识点,还是挺多可以讲,比如还可以牵扯到这几个问题: 多个 TCP 服务进程可以同时绑定同一个端口? 客户端端口可以重复使用?...我们可以调用 bind 前,对 socket 设置 SO_REUSEADDR 属性,可以解决这个问题。...如果 TCP 服务进程对 socket 设置 SO_REUSEADDR 属性了,那么重启时,即使存在一个和绑定 IP+PORT 一样 TIME_WAIT 状态连接,依然可以正常绑定成功,因此可以正常重启成功...因此,在所有 TCP 服务器程序,调用 bind 之前最好对 socket 设置 SO_REUSEADDR 属性,这不会产生危害,相反,它会帮助我们很快时间内重启服务端程序。‍...要解决这个问题,我们可以对 socket 设置 SO_REUSEADDR 属性。

1.3K21

socketSO_REUSEADDR参数全面分析

当处于listen状态socket监听本地地址ip部分是INADDR_ANY,即表示监听本地所有ip,即使使用这个参数,也不能再bind包含这个端口任意本地地址,这个和 2 描述其实是一样...其实,这个最开始man文档已经说过了,只要有listen占了一个本地地址,其他任何操作都不能再使用这个地址了。...我们socket和sk2本地址相同时,如果新socket没有设置SO_REUSEADDR参数,或者sk2没设置SO_REUSEADDR参数,或者sk2为listen状态,sk2最终都会不为null...和man文档基本是一样。 那我们平时写服务器时,为什么要加上这个参数呢?...我们知道,tcp连接,主动发起关闭请求那一端会最终进入TIME_WAIT状态,被动关闭连接那一端会直接进入CLOSE状态,即socket和它占用资源会直接销毁。

2.6K10

通过Node.jsCluster模块源码,深入PM2原理

Node.js无疑是走向大前端、全栈工程师技术栈最快捷径(但是一定要会一门其他后台语言,推荐Golang),虽然Node.js做很多事情都做不好,但是某些方面还是有它优势。...我Node.js官网找到了答案: image.png 原来所有的net.Socket都被设置了SO_REUSEADDR 这个SO_REUSEADDR到底是什么呢?...) 单进程或线程创建socket,并进行listen,预先创建好多个工作进程或线程accept()同一个服务器套接字 这两种模型解充分发挥了多核CPU优势,虽然可以做到线程和CPU核绑定,但都会存在...上面有提到SO_REUSEADDR选项,主进程调用_listen2就有设置。 子进程初始化每个workerinit函数,也有cluster....2.在内部TCP服务器请求处理逻辑,有负载均衡挑选出一个worker进程,将其发送一个newconn内部消息,随消息发送客户端句柄。

2.9K30

问题:Springboot框架开发项目中会内嵌tomcat容器,杀死进程时候tomcat为被正常杀死,导致端口未被释放,第二次启动时候报端口冲突。

kill -9 pid则是向进程号为pid进程发送SIGKILL(该信号编号为9),从本文上面的说明可知,SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。...通俗说,应用程序根本无法“感知”SIGKILL信号,它在完全无准备情况下,就被收到SIGKILL信号操作系统给干掉了,显然,在这种“暴力”情况下,应用程序完全没有释放当前占用资源机会。...事实上,SIGKILL信号是直接发给init进程,它收到该信号后,负责终止pid指定进程。关于linux init进程说明,可以参考这里或这里。...所以我们在这里调整stop之后休眠10s启动start 还有一种情况是:setsockopt参数SO_REUSEADDR 一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR...SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。

58020

经典面试题(三)之网络通信题目集锦

TCP与UDP区别与适用场景 5. linux常见网络模型详解(select、poll与epoll) 6. epoll_event结构epoll_data_tfd与ptr使用场景 7....异步connect函数如何编写 10.select函数可以检测网络异常? 11. epoll水平模式和边缘模式 12....如何将socket设置成非阻塞(创建时设置与创建完成后设置),非阻塞socket与阻塞socket收发数据上区别 13. send/recv(read/write)返回值大于0、等于0、小于0区别...18.socket选项SO_REUSEADDR和SO_REUSEPORT(Windows平台与linux平台区别) 19.socket选项SO_LINGER 20.shutdown与优雅关闭 21....socket选项SO_KEEPALIVE 22.关于错误码EINTR 23.如何解决tcp粘包问题 24.信号SIGPIPE与EPIPE错误码 25.gethostbyname阻塞与错误码获取问题 26

2.5K30

PHP网络编程之深入Libevent(十五节)

毫不要脸说,我写这些文章都不属于快餐消耗品,你不动手亲自实践是压根搞不定,哪儿有那么容易就能得到认知啊!况且我讲并不全,有很多资料知识是需要你自己搜索补充。...我再次强调一遍:这种xue微偏底层一丢丢基础知识,绝非类似于《XXX框架实战小程序》、《YYY框架实战电商》,这种基础知识看了后不会有立竿见影效果,甚至你工作里CURD都用不到。...其实这事儿看起来应该挺简单,好像大概似乎按葫芦画瓢就能搞定,但,是么?来来,琢磨一下,什么时候向客户端写入数据,是Event::READ事件回调函数?...这么做听起来是顺理成章回调读取了客户端飞过来数据后,马上使用socket_write()等把数据再飞回去给客户端... MD,那还要Event::WRITE有何用?...一般说来一个完整常规写事件使用方法是:当Event::READ事件发生后,回调函数首先读取数据,然后准备一个发送数据自定义缓冲区,当这个发送数据自定义缓冲区(注意不是socket缓冲区)没有数据后

97331

(二)Reactor模式

其实,SO_REUSEADDRwindows上和Unix平台上还有些细微区别,我libevent源码中看到这样描述: int evutil_make_listen_socket_reuseable...也就是在在Unix平台上,如果不设置这个选项,任意进程一定时间内,不能bind该地址;windows平台上,一定时间内,其他进程不能bind该地址,而本进程却可以再次bind该地址。...因为如果采取水平触发模式的话,主线程检测到某个客户端socket数据可读时,通知工作线程去收取该socket数据,这个时候主线程继续循环,只要在工作线程没有将该socket上数据全部收完,或者工作线程收取数据过程...相反,采取边缘触发模式,只有等某个工作线程将那个客户端socket上数据全部收取完毕,主线程epoll_wait才可能会再次触发来通知工作线程继续收取那个客户端socket新来数据。 5....代码中有这样一行: //gdb调试时不能实时刷新标准输出,用这个函数刷新标准输出,使信息屏幕上实时显示出来 std::cout << std::endl; 如果不加上这一行,正常运行服务器程序,程序要打印到控制台信息都会打印出来

1.6K80

socket五大误区

send API 函数有三类可能返回值: 如果数据成功排到传输队列,则返回 0。 如果排队失败,则返回 -1(通过使用 errno 变量可以了解失败原因)。...可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。 考虑清单 3 例子。绑定地址之前,我以 SO_REUSEADDR 选项调用 setsockopt。...( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); /* Allow connections to port 8080 from any available...但是如果试图一个套接字上发送二进制数据,事情将会变得更加复杂。 比如说,您想要发送一个整数:您可以肯定,接收者将使用同样方式来解释该整数?...GNU/Linux 工具和实用程序还可以帮助发现一些程序小问题。记住:查看实用程序帮助手册时候,跟踪相关或“请参见”工具。您也许会发现一个必要新工具。

80620

Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

SO_REUSEADDR选项 在上一篇文章最后我们贴出了一个简单C/S通信例程。...该例程序,使用"Ctrl+c"结束通信后,服务器是无法立即重启,如果尝试重启服务器,将被告知: bind: Address already in use 原因在于服务器重新启动时需要绑定地址...服务器端尽可能使用REUSEADD,bind()之前调用setsockopt来设置SO_REUSEADDR套接字选项,使用SO_REUSEADDR选项可以使不必等待TIME_WAIT状态消失就可以重启服务器...ERR_EXIT("setsockopt error"); 处理多客户服务器 在上一篇文章例程,服务器端只能够连接一个客户端,并不能处理多个客户端连接。...当一个新客户端连接已经放入已连接队列时,服务器并不能执行到accpet代码去获取队列连接。

56930

linux udp编程_linuxsocket编程

但是,并不是说我们就不能主动进行bind操作。...3、关于服务端bind操作,存在组播,多播等多种通信方式情况下,也还有一些需要注意点,这个我们在下面的章节描述 二、UDP通信基本函数说明 UDP,完成一个基本通信涉及到几个函数如下...addrlen参数很好理解,就是struct sockaddr参数长度,一般使用过程也不会有什么疑问,但是我们使用recvfrom时,就需要注意addrlen这个参数了,如果我们不需要关心发送者...解决方法如下:(允许端口重用) int on = 1; ret = setsockopt(udp_net_sta.socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof...(int)); if (ret < 0) { perror("socket set SO_REUSEADDR failed"); } 2、服务端程序,创建完socket后,有一个bind操作

11K10

Python入门之并发编程IO模型

#举例: #1. multiprocessing.Pool下apply #发起同步调用后,就在原地等着任务结束, #根本不考虑任务是计算还是io阻塞,总之就是一股脑等任务结束 #2. concurrent.futures.ProcessPoolExecutor...阻塞调用:当socket工作阻塞模式时候,如果没有数据情况下调用recv函数, #则当前线程就会被挂起,直到有数据为止。...这两种技术#都可以很好降低系统开销,都被广泛应用很多大型系统,如websphere、tomcat和各种数#据库等。...对应上例所面临可能同时出现上千甚至上万次客户端请求,“线程池”或“连接池”或许可以缓解部分压力,但是不能解决所有问题。...多路复用模型,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户process其实是一直被block

57870

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券