最近在使用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的细节确实值得好好研究。