首页 > 其他分享 >从gin的启动开始看socket是如何在go服务器中创建的

从gin的启动开始看socket是如何在go服务器中创建的

时间:2022-12-08 15:45:13浏览次数:34  
标签:socket err syscall windows Go go gin net


从gin的启动开始看socket是如何在服务器中创建的:
gin -> net/http -> net -> internal/syscall -> syscall -> runtime
通过上面的调用流程,可以看出,http是对net的封装,方便开发者调用,实际创建Socket的还是net库,底层已经是到了go的syscall和runtime库了。
最终调用的还是操作系统提供的socket接口。这就是socket创建的流程。

 

具体流程涉及的文件以及代码:
router.go

r := gin.New()
r.Run(address) // host:port

  

github.com\gin-gonic\[email protected]\gin.go

err = http.ListenAndServe(address, engine)

  

Go\src\net\http\server.go

// Go net/http包
return server.ListenAndServe()
ln, err := net.Listen("tcp", addr) // http也是对net的封装
if err != nil {
return err
}

  

Go\src\net\dial.go

return lc.Listen(context.Background(), network, address)
l, err = sl.listenTCP(ctx, la)

  

Go\src\net\tcpsock_posix.go

fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, 0, "listen", sl.ListenConfig.Control)

  

Go\src\net\ipsock_posix.go

return socket(ctx, net, family, sotype, proto, ipv6only, laddr, raddr, ctrlFn) // 出现socket函数了

  

Go\src\net\sock_posix.go

// socket returns a network file descriptor that is ready for
// asynchronous I/O using the network poller.

s, err := sysSocket(family, sotype, proto)

  

Go\src\net\sock_windows.go

s, err := wsaSocketFunc(int32(family), int32(sotype), int32(proto),nil, 0, windows.WSA_FLAG_OVERLAPPED|windows.WSA_FLAG_NO_HANDLE_INHERIT)

  


Go\src\net\hook_windows.go

wsaSocketFunc func(int32, int32, int32, *syscall.WSAProtocolInfo, uint32, uint32) (syscall.Handle, error) = windows.WSASocket // windows.WSASocket就是返回的socket

  

Go\src\internal\syscall\windows\zsyscall_windows.go

// 可以看到文件已经跳转到internal文件夹下的系统相关调用目录
func WSASocket(af int32, typ int32, protocol int32, protoInfo *WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) {
  r0, _, e1 := syscall.Syscall6(procWSASocketW.Addr(), 6, uintptr(af), uintptr(typ), uintptr(protocol), uintptr(unsafe.Pointer(protoInfo)), uintptr(group), uintptr(flags))
  handle = Handle(r0)
  if handle == InvalidHandle {
    err = errnoErr(e1)
  }
  return
}

  

=== r0 start ===
C:\Program Files\Go\src\syscall\dll_windows.go

// 可以看到文件已经跳转到syscall系统调用目录,dll_windows名称也可看出该文件底层调用的是windos系统提供的接口。
// Implemented in ../runtime/syscall_windows.go.
// 注释中是说继承于../runtime/syscall_windows.go文件中的Syscall6,这个写法比较特殊,是go1.14刚出的,go:linkname,有兴趣的可以继续深入这个写法,这里不做赘述。
func Syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)

  


C:\Program Files\Go\src\runtime\syscall_windows.go

//go:linkname syscall_Syscall6 syscall.Syscall6
//go:nosplit
//go:cgo_unsafe_args
func syscall_Syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
  lockOSThread()
  defer unlockOSThread()
  c := &getg().m.syscall
  c.fn = fn
  c.n = nargs
  c.args = uintptr(noescape(unsafe.Pointer(&a1)))
  cgocall(asmstdcallAddr, unsafe.Pointer(c))
  return c.r1, c.r2, c.err
}

  

=== r0 end ===

标签:socket,err,syscall,windows,Go,go,gin,net
From: https://www.cnblogs.com/yourstars/p/16966275.html

相关文章

  • vue3 el-pagination 将 英文 修改 为 中文
    当前视图:我要做的是将Total类似的英文改为中文 1. 在组件里引入 ElConfigProvider组件和中文包//ElConfigProvider组件import{ElConfigProvider}f......
  • go gin
     一、1.安装goget-ugithub.com/gin-gonic/gin 2.例子packagemainimport"github.com/gin-gonic/gin"funcmain(){r:=gin.Default()r.GET("/ping",func(c......
  • GO函数
    GO函数1.1函数分类在go语言中,函数是第一类对象,我们可以将函数保存到变量中。函数主要有具名和匿名之分,包级函数一般都是具名函数,具名函数是匿名函数的一种特例,当匿名函......
  • Google Earth Engine(GEE)——MODIS影像平滑函数的进行
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • uniapp 同时存在两个websocket 冲突
    同时存在两个websocket需要改用SocketTask 推荐使用 SocketTask 的方式去管理webSocket链接,每一条链路的生命周期都更加可控,同时存在多个webSocket的链接的情况下......
  • Go社区一些约定俗成的规范:
    昨天正巧翻到一位Gopher的博客,发现他写的文章质量都挺高的于是今天早上就一直在看。https://lailin.xyz/post/go-training-week4-project-layout.html正好觉得自己的Gola......
  • 重磅!涛思数据发布 TDengine PI 连接器
    ​​TDengine​​提供的混合解决方案,可以让企业既能保留传统的PI系统,又能轻松获得现代云平台提供的所有好处。涛思数据宣布发布TDenginePI连接器。在很多制造业企业中,......
  • TDengine PI 连接器发布——几次点击,让 PI System 数据轻松上云
    “TDengine提供的混合解决方案,可以让企业既能保留传统的PI系统,又能轻松获得现代云平台提供的所有好处”涛思数据宣布发布TDenginePI连接器。......
  • 每日一抄 Go语言封装qsort快速排序函数
    packageqsort/*《GO语言高级编程》设计中案例,仅作为笔记进行收藏。qsort快速排序函数是C语⾔的⾼阶函数,⽀持⽤于⾃定义排序⽐较函数,可以对任意类型的数组进⾏排序。*......
  • easylogging++的那些事(四)源码分析(十一)Storage类的其他接口
    目录已经介绍过Storage类的接口Storage类的其他接口获取注册的日志记录器的管理类获取VERBOSE日志信息管理类获取异步日志队列获取命令行参数解析器与全局LoggingFlag......