情景描述:
进程A,监听本地83端口;进程B,连接本地83端口。
启动进程A,通过netstat -ano
查看,结果如下:
TCP 0.0.0.0:83 0.0.0.0:0 LISTENING 6984
启动进程B,再通过netstat -ano
查看,结果如下:
TCP 0.0.0.0:83 0.0.0.0:0 LISTENING 6984
TCP 127.0.0.1:83 127.0.0.1:4777 ESTABLISHED 6984
TCP 127.0.0.1:4773 127.0.0.1:4774 ESTABLISHED 292
TCP 127.0.0.1:4774 127.0.0.1:4773 ESTABLISHED 292
TCP 127.0.0.1:4775 127.0.0.1:4776 ESTABLISHED 292
TCP 127.0.0.1:4776 127.0.0.1:4775 ESTABLISHED 292
TCP 127.0.0.1:4777 127.0.0.1:83 ESTABLISHED 292
为什么会出现进程B自己连自己的情况呢?
跟踪进去后发现,进程B用了libevent,在创建event_base的过程中:
首先,evsig_init()
调用evutil_socketpair()
创建了一个socket pair。
之后,evthread_make_base_notifiable()
也调用evutil_socketpair()
创建了一个socket pair。