最近在使用thrift 的时候,遇到的问题,代码参见:thrift 框架简单使用

就是一个简单的客户端与服务端交互,服务端是最简单的单进程单线程,for循环poll 模型,做如下操作:

1、后台运行server

./server & 

2、新开一个客户端,gdb 跟踪client1

gdb --args ./client

跟踪到 connect 连接返回,rpc调用前。

3、新开一个客户端,gdb 跟踪client2

gdb --args ./client

跟踪到 connect 连接返回,rpc调用前。

此时用netstat 查看连接:

有一个连接的进程名显示横线'-',但状态是established,可以推测这个连接在client 角度建立了,但是server角度还没准备好。

因为这份server 代码是单进程单线程,for 循环,每次处理一个请求,而这个没有显示进程名的对应的是client2 发起的连接。

 

参考:netstat -ntap不显示某些连接的pid /进程名称 原话:进程在内核中运行

所以这里的推测是,这个连接在客户端是设置为非阻塞的,所以connect 返回了,站在客户端角度连接是建立了。

但是在server端,因为在for 循环中还在处理第一个客户端的请求,所以第二个请求无暇顾及,还在内核队列中,所以显示的进程名是一个横线。

关于内核队列参考:高性能网络编程(一)----accept建立连接 作者貌似是《深入理解nginx》一书作者,写的很详细,TCP的细节确实值得好好研究。

 

 

 

 

 

 

 

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐