Golang 端口复用测试的实现

先给出结论:

同一个进程,使用一个端口,然后连接关闭,大约需要30s后才可再次使用这个端口。

测试

首先使用端口9001连接服务端,发送数据,然后关闭连接,接着再次使用端口9001连接服务端,如果连接失败,间隔15s后,再次尝试,最多尝试3次,。

client

package main
import (

 "bufio"
 "fmt"
 "net"
 "os"
 "time"
)

func DialCustom(network, address string, timeout time.Duration, localIP []byte, localPort int)(net.Conn,error) {
 netAddr := &net.TCPAddr{Port:localPort}

 if len(localIP) != 0 {
 netAddr.IP = localIP
 }

 fmt.Println("netAddr:", netAddr)

 d := net.Dialer{Timeout: timeout, LocalAddr: netAddr}
 return d.Dial(network, address)
}

func getOneConn() {

 serverAddr := "127.0.0.1:8080"

 // 172.28.172.180
 //localIP := []byte{0xAC, 0x1C, 0xAC, 0xB4} // IP
 localIP := []byte{} // any IP
 localPort := 9001

 var conn net.Conn
 var err error

 for i:=0;i<3;i++{

 conn, err = DialCustom("tcp", serverAddr, time.Second*10, localIP,localPort)
 if err != nil {
 fmt.Println("dial failed:", err)
 if i == 2 {
 os.Exit(1)
 }
 time.Sleep(15*time.Second)
 } else {
 break
 }
 }

 defer conn.Close()

 buffer := make([]byte, 512)
 reader := bufio.NewReader(conn)

 n, err2 := reader.Read(buffer)
 if err2 != nil {
 fmt.Println("Read failed:", err2)
 return
 }

 fmt.Println("count:", n, "msg:", string(buffer))

}

func main() {
 getOneConn()
 fmt.Println("=========================")
 getOneConn()
 fmt.Println("=========================")
 select{}

}

server

package main

import (
 "fmt"
 "net"
 "log"
)

func main() {

 addr := "0.0.0.0:8080"

 tcpAddr, err := net.ResolveTCPAddr("tcp",addr)

 if err != nil {
 log.Fatalf("net.ResovleTCPAddr fail:%s", addr)
 }

 listener, err := net.ListenTCP("tcp", tcpAddr)
 if err != nil {
 log.Fatalf("listen %s fail: %s", addr, err)
 } else {

 log.Println("rpc listening", addr)
 }

 for {
 conn, err := listener.Accept()
 if err != nil {
 log.Println("listener.Accept error:", err)
 continue
 }

 go handleConnection(conn)

 }

}

func handleConnection(conn net.Conn) {

 //defer conn.Close()

 var buffer []byte = []byte("You are welcome. I'm server.")

 n, err := conn.Write(buffer)

 if err != nil {

 fmt.Println("Write error:", err)
 }
 fmt.Println("send:", n)

 fmt.Println("connetion end")
}

output

client输出:

$ ./client
netAddr: :9001
count: 28 msg: You are welcome. I'm server.
=========================
netAddr: :9001
dial failed: dial tcp :9001->127.0.0.1:8080: bind: address already in use

netAddr: :9001
dial failed: dial tcp :9001->127.0.0.1:8080: bind: address already in use

netAddr: :9001
count: 28 msg: You are welcome. I'm server.
=========================

经过3次重试,30s后,才可以重新使用同一个端口9001进行连接。也就是同一个进程的情况狂下,一个连接关闭后,端口大约30s后才可以被使用。

到此这篇关于Golang 端口复用测试的实现的文章就介绍到这了,更多相关Golang 端口复用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang端口占用检测的使用

    在运维开发的过程中,经常碰到这样的情况:启动某个应用前,需要先检测一下端口是否被其他的应用占用了,若占用了,能否得到占用进程的PID.后续可以根据这个PID,查找是哪个应用占据这端口,然后KILL掉.非常简单的需求,思路是: 利用 netstat 命令获取当前的相关端口号的PID,然后正则表达式过滤出相关的PID即可 netstat -ano | findstr 8099 输出如下: 以windows 系统下为例,linux系统下,修改相关参数即可.代码如下: // 传入查询的端口号 // 返回

  • GO语言实现的端口扫描器分享

    复制代码 代码如下: //GO语言  实现端口扫描     //缺陷     //port  无法设置成全局变量不知道怎么设置的     //var l = list.New()   这个是数组操作并不是消息队列    跟消息队列功能类似 //实现功能     //实现生成 IP段     //实现端口扫描     //实现参数传入     //写入文件到本地     //main.go 58.215.20.30 58.215.201.30 80     //文件名 开始IP 结束IP 扫描端口

  • Golang 端口复用测试的实现

    先给出结论: 同一个进程,使用一个端口,然后连接关闭,大约需要30s后才可再次使用这个端口. 测试 首先使用端口9001连接服务端,发送数据,然后关闭连接,接着再次使用端口9001连接服务端,如果连接失败,间隔15s后,再次尝试,最多尝试3次,. client package main import ( "bufio" "fmt" "net" "os" "time" ) func DialCustom(ne

  • Python的Socket编程过程中实现UDP端口复用的实例分享

    关于端口复用 一个套接字不能同时绑定多个端口,如果客户端想绑定端口号,一定要调用发送信息函数之前绑定( bind )端口,因为在发送信息函数( sendto, 或 write ),系统会自动给当前网络程序分配一个随机端口号,这相当于随机绑定了一个端口号,这里只会分配一次,以后通信就以这个随机端口通信,我们再绑定端口号的话,就会绑定失败.如果我们放在发送信息函数( sendto, 或 write )之前绑定,那样程序将以我们绑定的端口号发送信息,不会再随机分配一个端口号.实际上,默认的情况下,如果

  • Python实现端口复用实例代码

    本文介绍Python实现端口复用实例如下所示: #coding=utf-8 import socket import sys import select import threading host='192.168.99.100' port=80 class Thread(threading.Thread): def __init__(self,buf,sockfd): threading.Thread.__init__(self) self.buf=buf self.sockfd=sockfd

  • php使用event扩展的io复用测试的示例

    先要安装event扩展,这样才可以使用libevent的事件机制 pecl install event 测试代码 //连接重用 //创建资源流的上下文 $context=stream_context_create([ 'socket'=>[ 'backlog'=>2000 ]]); stream_context_set_option($context,'socket','so_reuseaddr',1); //设置连接重用 //sock_set_option($this->server,

  • Golang之模糊测试工具的使用

    目录 背景 开发环境 go-fuzzing fuzz tests规则 如何使用go-fuzzing 生产环境项目Go版本问题 背景 我们经常调侃程序员每天都在写bug,这确实是事实,没有测出bug不代表程序就真的不存在问题.传统的代码review.静态分析.人工测试和自动化的单元测试无法穷尽所有输入组合,尤其是难以模拟一些随机的.边缘的数据. 去年6月,Go官方发布称gotip版本已经原生支持Fuzzing并开始了公测,将与[Go 1.18版本]一起在2022年中发布,go-fuzzing至今已

  • golang使用 gomodule 在公共测试环境管理go的依赖的实例详解

    背景:调试服务最好的方式就是直接上机实践.对在公司的员工来说,在同一套服务上协同开发比在单独的环境上开发,应该会更有感觉.有问题可以一起发现并解决,也能够一同开发需求. 但是,公司的测试机往往是没办法连外网的,而golang 的大部分工程都需要直接从github 上下载依赖,这就导致 依赖文件需要先提前上传到开发机上.那么当开发机上需要运行多个golang 工程的时候,如何共享这些依赖,减少维护依赖库的工作量呢? 这也是需要大家协作完成的- 最终总结:项目采用 go module + vendo

  • GoLang基础学习之go test测试

    目录 1.介绍 2.函数 3.测试函数格式 3.1格式 3.2失败示例 3.3成功示例1 3.4成功示例2 3.5成功示例3 3.6成功实例4 4.基准函数 4.1成功实例1 4.2成功实例2 4.3性能比较函数 总结 1.介绍 Go语言中的测试依赖go test命令.编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法.规则或工具: go test 命令是go语言内置的命令 go test命令是一个按照一定约定和组织的测试代码的驱动程序在我们执行了go tets命令之后,这个命令

  • Rainbond的ServiceMesh架构组件端口冲突处理解决

    目录 组件间的通讯问题 方式一:通过HTTP 7层网络治理进行端口复用 方式二:动态变更组件的监听端口 方式三:使用 Kubernetes 原生 Service 治理模式 方式四:使用 Istio 网络治理模式 组件间的通讯问题 在我们部署具有多个服务的分布式业务时,必须要考虑的一点就是如何处理服务之间的通信问题,那么当我们将业务部署到Rainbond 上时,又是如何去处理的呢? Rainbond 开箱即用的ServiceMesh架构默认通过 Sidecar 代理的方式,为我们透明的解决了分布式

  • Golang 实现 RTP音视频传输示例详解

    目录 引言 RTP 数据包头部字段 Golang 的相关实现 结尾 引言 在 Coding 之前我们先来简单介绍一下 RTP(Real-time Transport Protocol), 正如它的名字所说,用于互联网的实时传输协议,通过 IP 网络传输音频和视频的网络协议. 由音视频传输工作小组开发,1996 年首次发布,并提出了以下使用设想. 简单的多播音频会议 使用 IP 的多播服务进行语音通信.通过某种分配机制,获取多播组地址和端口对.一个端口用于音频数据的,另一个用于控制(RTCP)包,

随机推荐