Серверные сокеты перестают работать - PullRequest
0 голосов
/ 05 июня 2011

У меня есть приложение, которое связывает два порта: 6961 и 6963. Это приложение в форме клиент-сервер-клиент, в котором один клиент контролирует другой.

Приложение работает отлично, но после, казалось бы, случайного количества принятых и закрытых соединений, сервер отказывается принимать или отправлять данные через сокеты. Я могу установить соединение с telnet, но когда я что-то набираю, я не получаю ответ.

У меня были случаи, когда сервер принимал до 370 соединений, пока он не отказывался работать, но в прошлый раз он принимал только 70 соединений.

Я не думаю, что это имеет отношение к закрытию сокетов, что, я думаю, я делаю правильно. Это мой вывод netstat и lsof при запуске приложения. Но я не знаю, как их интерпретировать. Я просто нашел их, когда гуглил.

$ 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

У меня нет идеи, с чего начать поиск ошибки.

1 Ответ

0 голосов
/ 05 июня 2011

Ваш код явно содержит ошибку, и вы не предоставили достаточно информации. Итак, начните разбивать свой код и выяснять, что не работает. Проверьте, что вы передаете своей функции блокировки (выберите / poll / kqueue / что угодно) и убедитесь, что это имеет смысл. Если это не так, выясните, почему.

Я ожидаю, что вы обнаружите, что перестали ждать дескриптор, где вы должны ждать, но, конечно, у вас может быть более интересная ошибка.

...