当前位置: 首页 > 面试题库 >

Go中的TCP连接

赖杰
2023-03-14
问题内容

这是我的代码:

package main

import (                                                                           
    "fmt"                                                                          
    "net"                                                                          
)

func main() {                                                                      
    addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8081")                         
    listener, _ := net.ListenTCP("tcp", addr)                                      
    fmt.Printf("listener addr: %s\n", listener.Addr().String())                    
    for {                                                                          
        conn, err := listener.AcceptTCP()                                          
        if err != nil {                                                            
            // handle error                                                        
            fmt.Println("err")                                                     
            return                                                                 
        }                                                                          
        go handleConnection(conn)                                                  
    }                                                                              
}

func handleConnection(conn *net.TCPConn) {                                         
    fmt.Printf("conn addr: %s\n", conn.LocalAddr().String())                       
    fmt.Printf("conn remote addr: %s\n", conn.RemoteAddr().String())               
}

输出量

listener addr: 127.0.0.1:8081
conn addr: 127.0.0.1:8081
conn remote addr: 127.0.0.1:1234

为什么listenerconn具有相同的地址?在TCP中,我认为为新连接创建了一个新套接字。


问题答案:

这让我困惑了一秒钟,但这是正确的。确实创建了一个新的套接字(具有唯一的本地+远程地址元组)。维基百科的这段引文很好地描述了它:

服务器可以使用相同的本地端口号和本地IP地址创建多个同时建立的TCP套接字,每个套接字都映射到其自己的服务器子进程,并为自己的客户端进程提供服务。由于远程套接字地址(客户端IP地址和/或端口号)不同,因此操作系统将它们视为不同的套接字。即因为它们具有不同的套接字对元组。

如果您以其他方式(即传出连接)进行考虑,则看到许多套接字(例如google.com:80)之间的远程地址相同,则不会感到奇怪,因此传入连接也是如此。

这样做的一个很好的副作用是netstat,在检查套接字时,诸如之类的工具可以很好地显示源端口,而不是随机对。



 类似资料:
  • 问题内容: 在Go中,TCP连接(net.Conn)是io.ReadWriteCloser。我想通过模拟TCP连接来测试我的网络代码。我有两个要求: 要读取的数据存储在字符串中 每当写入数据时,我都希望将其存储在某种缓冲区中,以便以后使用 是否有数据结构或简单的方法? 问题答案: 为什么不使用?它是一种并且具有获取存储数据的方法。如果需要将其设置为,则可以定义自己的类型: 并定义一个方法:

  • 问题内容: 我有以下几点: 然后两个功能: 其中ReadLogStash是正在运行的goroutine。如果另一侧关闭,我得到EOF。ReadLogStash中的一个好的实现是什么,当它获得EOF时,尝试每X秒重新建立一次连接? 问题答案: Go有同步和沟通的渠道,请使用它们! 使您的连接处于循环状态,并让它等待某种消息返回通道。 除非您在ReadLogStash中具有更多功能,否则您可能只能使用

  • 我是socket新手,正在尝试通过tcp socket创建连接池。我的实现为每个调用发送32位长度的二进制消息。但有时读卡器从服务器接收到以前的响应时,我会遇到问题(当客户端关闭并在发送错误时重新建立套接字时,可能会发生这种情况)。如何在新请求之前刷新套接字(上次调用的剩余字节)。有什么建议吗? 编辑:我了解到tcp总是流0s,如果我在消息之前发送字节(1),这样我就可以使用刷新功能在新调用之前检

  • 有很多close_wait连接,当客户端客户端将消息发送到服务器并输出TCP FSM卡在close_wait状态时 这是客户端代码, 这是侦听即将到来的连接的服务器代码 输出TCP FSM

  • 首先我使用了 "github.com/confluentinc/confluent-kafka-go/kafka" 这个包来连接Kafka,之后实现了个连接池的功能,代码如下: 开发完之后,我打算执行交叉编译,编译为Linux下可执行文件,打包脚本如下:(之前使用MQ的时候就没有问题,换成了kafka就报错): 报错如下: 十分不理解,这是什么原因呢?换成kafka之后,不能进行交叉编译么?请各位

  • 在这篇文章runn-mongob-querys-contined-with-go中说mgo。DialSusInfo:创建一个会话,它维护一个到MongoDB的套接字连接池,但是当我在函数DialSusInfo的文档中查找时,我没有找到谈论池连接的东西,只有我在Dial Function Dial Function中找到了一些东西,上面写着:对于给定的集群,此方法通常只调用一次。然后在获得的会话上使