Golang 的 socket 编程 (一):常用数据结构和函数介绍

马谦马谦马谦 Golang评论2651字数 1945阅读 6 分 29 秒阅读模式

工作的原因接触到 socket,要使用 socket 实现一个长连接。之前只在 C/C++上用过 socket,而且在学校的时候也只是简单的做聊天室小程序,并没有涉及到长连接。突然用到工作项目上,心里还是有点悬的,毕竟网上的资料也不是很多。这里就一步一步记录下学习的过程、遇到的问题以及最重要的——解决问题的方法。

一、说明

golang 中的 socket 需要用到 net 包,里面封装好了很多常用的函数方法以及元素类型。而且无需像 C 一样要经历 socket,bind,listen,accept 等等流程,只需要简单的几步流程就能完成,非常方便。

二、 IP 类型

net 包中定义的 ip 类型直接就是 byte 数组:

我们可以使用 func parseIP(s string) IP 来把一个 ip 地址转换成 IP 类型:

三、函数

3.1 funcResolveTCPAddr(net, addr string) (*TCPAddr, error)

ResolveTCPAddr 函数的功能是解析 TCP 连接的地址,包含 ipport

  • nettcp tcp4 tcp6 三选一,分别表示 TCPv4,TCPv6 和任意,默认是 tcp4
  • addr:主机的地址,可以是 [ip+port],也可以是 [domain+port],可以省略主机部分,表示本机地址

返回一个*TCPAddr 类型 ,表示一个 TCP 连接地址:

3.2 func ResolveIPAddr(net, addr string) (*IPAddr, error)

ResolveIPAddr 函数的功能是解析 ip 地址:

  • netip  ip4 ip6 分别代表 IPv4,IPv6 以及任意。默认留空表示 ip4
  • addr :IP 地址

返回一个*IPAddr 结构:

3.3 func Dial(network, address string) (Conn, error)

Dial 函数的功能是建立一个连接:

  • network: 如果是 TCP 连接,对应 tcp tcp4 tcp6;如果是 IP 连接,对应 ip ip4 ip6 。对于 ip 连接,需要在后面加一个冒号然后注明协议号或者协议名字
  • address:连接的地址,ip+portdomain+port 形式,也可以省略主机地址表示本地地址 217.0.0.1

返回一个 net.Conn 接口对象,包含了连接的信息,我们可以使用该对象的 Write()Read()对连接进行读写。

与这个函数相对应的两个函数:

  • func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)
  • func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error)

分别表示建立 TCP 请求和 IP 请求,中间多的 laddr 表示本地的地址,一般为 nil 。

3.4 func (c *conn) Write(b []byte) (int, error)

conn 连接对象中写入数据,即发送数据给对方,写入的数据是 []byte 类型,成功将返回发送的数据包字节数。

3.5 func (c *conn) Read(b []byte) (int, error)

从 conn 连接对象中读取数据,成功将返回读取到的字节数。

3.6 func Listen(net, laddr string) (Listener, error)

Listen 函数在服务端使用,让服务端开始监听。

  • net :和上面一样,可以是 tcp ip 相关的值
  • laddr :要监听的地址,ip+port 省略主机地址将使用本机地址 127.0.0.1

相应的两个函数:

  • func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error):监听 TCP 连接
  • func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error):监听 IP 连接

3.7 func (l *TCPListener) Accept() (Conn, error)

服务端开始监听需要使用 Accept 函数来接受客户端连接,此时服务端将进入阻塞状态。

相应的还有一个

  • func (l *TCPListener) AcceptTCP() (*TCPConn, error)

  最后更新:2017-11-18
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2017 年 9 月 12 日 21:39:55
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/golang/golang-socket-1.html
解决gvm工具无法下载安装包的问题 Golang

解决 gvm 工具无法下载安装包的问题

GVM(Go Version Manager) 是一款用于管理和切换不同 Go 语言版本的工具。它允许用户在同一台计算机上轻松安装、使用和管理多个 Go 版本,同时还能确保项目之间的依赖关系井然有序。 GVM 的主...
国内几个优质的Go Module代理仓库服务 Golang

国内几个优质的 Go Module 代理仓库服务

一、简介 go module 公共代理仓库,代理并缓存 go 模块。你可以利用该代理来避免 DNS 污染导致的模块拉取缓慢或失败的问题,加速你的构建。 简单来说就是国内访问被墙,go get 无法在线获取到仓库,...
socket多路IO复用之select模型 C/C++

socket 多路 IO 复用之 select 模型

select 模型是 socket 中的一种多路 IO 复用模型之一,通过轮询的方式来完成多路访问控制。 一个很简单的例子来描述 select 模型: 幼儿园老师要照顾所有的小朋友,每天他都会轮流去问小朋友:「小朋...
TCP协议中的三次握手和四次挥手 TCP/IP

TCP 协议中的三次握手和四次挥手

一、三次握手 TCP 协议的三次握手和四次挥手分别表示了 TCP 连接的建立和释放过程,在整个 TCP 协议是一个很重要的内容,同时也是面试时的常见考点。 趁着找工作的劲,使用 socket+tcpdump 分析了...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证