15

ソケット ファイル記述子を繰り返し処理しているときに、そのうちの 1 つがパッシブ ソケット (接続をリッスンしている) からのものかどうかを確認するにはどうすればよいですか?

4

3 に答える 3

24

これはgetsockopt ( SO_ACCEPTCONN ) で確認できます。例えば:

#include <sys/socket.h>

int val;
socklen_t len = sizeof(val);
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1)
    printf("fd %d is not a socket\n", fd);
else if (val)
    printf("fd %d is a listening socket\n", fd);
else
    printf("fd %d is a non-listening socket\n", fd);
于 2012-04-21T18:08:06.513 に答える
0

厳密に言えば、ソケットからの接続を受け入れようとするなど、ソケットの種類を偶然に判断する操作をソケットに対して実行することができます。EINVAL で失敗した場合accept()は、リッスンしていないというかなり良い兆候です。:)

ただし、どのソケットがどれであるかを追跡することは、全体的にはより良い解決策です。非常に単純なアプリケーションを構築している場合を除き、各ソケットに何らかの追加データを保持する必要がある可能性があります。

于 2012-04-21T17:58:09.970 に答える
0

コマンドラインで実行できます (Mac/Linux 環境):

lsof -i

および/または (Linux/Mac/Windows 環境)

netstat -a
于 2012-04-21T17:02:11.087 に答える