【问题标题】:Server daemon's sockets stop working服务器守护进程的套接字停止工作
【发布时间】:2011-09-08 17:16:59
【问题描述】:

我有一个绑定两个端口的应用程序:6961 和 6963。它是一个客户端-服务器-客户端形式的应用程序,其中一个客户端控制另一个。

应用程序运行良好,但在看似随机数量的接受和关闭连接之后,服务器拒绝通过套接字接收或发送数据。我可以与telnet 建立联系,但是当我输入内容时,我没有得到回复。

我曾经有几次服务器最多接受 370 个连接,直到它拒绝工作,但上次它只接受 70 个连接。

我认为这与关闭套接字无关,我认为我这样做是正确的。这是我启动应用程序时的netstatlsof 输出。但我真的不知道如何解释它们。我是在谷歌搜索时发现的。

$ sudo /etc/init.d/icontrold restart
Stopping daemon
Starting daemon
$ sudo netstat | grep -E 696[13]
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50005 TIME_WAIT  
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50759 ESTABLISHED
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50758 TIME_WAIT  
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50764 FIN_WAIT2  
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50761 TIME_WAIT  
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50763 TIME_WAIT  
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50762 TIME_WAIT  
$ sudo lsof | grep icontrol
icontrold 5765       root  cwd       DIR        8,1    4096     884738 /home/ief2
icontrold 5765       root  rtd       DIR        8,1    4096          2 /
icontrold 5765       root  txt       REG        8,1  212372    5431298 /usr/sbin/icontrold
icontrold 5765       root  mem       REG        0,0                  0 [heap] (stat: No such file or directory)
icontrold 5765       root  mem       REG        8,1   77808    5425003 /usr/lib/libz.so.1.2.3
icontrold 5765       root  mem       REG        8,1    9640     671771 /lib/tls/i686/cmov/libdl-2.4.so
icontrold 5765       root  mem       REG        8,1 1248904     671768 /lib/tls/i686/cmov/libc-2.4.so
icontrold 5765       root  mem       REG        8,1   40208     671760 /lib/libgcc_s.so.1
icontrold 5765       root  mem       REG        8,1  149284     671772 /lib/tls/i686/cmov/libm-2.4.so
icontrold 5765       root  mem       REG        8,1  888612    5425516 /usr/lib/libstdc++.so.6.0.8
icontrold 5765       root  mem       REG        8,1   95056     671782 /lib/tls/i686/cmov/libpthread-2.4.so
icontrold 5765       root  mem       REG        8,1 1268568    5458256 /usr/lib/i686/cmov/libcrypto.so.0.9.8
icontrold 5765       root  mem       REG        8,1  255648    5458257 /usr/lib/i686/cmov/libssl.so.0.9.8
icontrold 5765       root  mem       REG        8,1  105112     673124 /lib/ld-2.4.so
icontrold 5765       root    0u     IPv6      16962                TCP *:6963 (LISTEN)
icontrold 5765       root    1u     IPv6      16965                TCP *:6961 (LISTEN)
icontrold 5765       root    4u     IPv6      16968                TCP 192.168.1.10:6963->192.168.1.4:50759 (ESTABLISHED)
$

这是服务器停止接受时两个命令的输出:

$ sudo lsof | grep icontrol
icontrold 4645       root  cwd       DIR        8,1    4096    7913473 /root
icontrold 4645       root  rtd       DIR        8,1    4096          2 /
icontrold 4645       root  txt       REG        8,1  212372    5431298 /usr/sbin/icontrold
icontrold 4645       root  mem       REG        0,0                  0 [heap] (stat: No such file or directory)
icontrold 4645       root  mem       REG        8,1   77808    5425003 /usr/lib/libz.so.1.2.3
icontrold 4645       root  mem       REG        8,1    9640     671771 /lib/tls/i686/cmov/libdl-2.4.so
icontrold 4645       root  mem       REG        8,1 1248904     671768 /lib/tls/i686/cmov/libc-2.4.so
icontrold 4645       root  mem       REG        8,1   40208     671760 /lib/libgcc_s.so.1
icontrold 4645       root  mem       REG        8,1  149284     671772 /lib/tls/i686/cmov/libm-2.4.so
icontrold 4645       root  mem       REG        8,1  888612    5425516 /usr/lib/libstdc++.so.6.0.8
icontrold 4645       root  mem       REG        8,1   95056     671782 /lib/tls/i686/cmov/libpthread-2.4.so
icontrold 4645       root  mem       REG        8,1 1268568    5458256 /usr/lib/i686/cmov/libcrypto.so.0.9.8
icontrold 4645       root  mem       REG        8,1  255648    5458257 /usr/lib/i686/cmov/libssl.so.0.9.8
icontrold 4645       root  mem       REG        8,1  105112     673124 /lib/ld-2.4.so
icontrold 4645       root    0u     IPv6      13679                TCP *:6963 (LISTEN)
icontrold 4645       root    2u     IPv6      13683                TCP *:6961 (LISTEN)
icontrold 4645       root    3u     IPv6      15276                TCP 192.168.1.10:6963->192.168.1.4:50730 (ESTABLISHED)
icontrold 4645       root    4u     IPv6      13685                TCP 192.168.1.10:6963->192.168.1.4:50005 (ESTABLISHED)
$ sudo netstat | grep 6963
tcp6       0      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50005 ESTABLISHED
tcp6       9      0 ::ffff:192.168.1.1:6963 ::ffff:192.168.1.:50730 ESTABLISHED

我不知道从哪里开始寻找错误。

【问题讨论】:

  • 不可能只用 lsof 和 netstat 输出来回答,你可能有一个错误。将其归结为复制器并发布一些代码。如果您真的不知道从哪里开始,请在valgrind 下运行并修复它所抱怨的任何问题。

标签: c++ sockets unix send recv


【解决方案1】:

您的代码显然存在错误,并且您没有提供足够的信息。所以,开始分解你的代码并找出问题所在。检查你传递给阻塞函数的内容(select/poll/kqueue/whatever)并确保它有意义。如果不是,请找出原因。

我希望你会发现你不再等待你应该等待的句柄,但当然你可能有一个更有趣的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多