2016-07-07 12 views
2

私は、TCPサーバーソケットを開くライブラリ(この場合はgstreamer)を呼び出すコードを持っています。私はポート番号を持っていますが、私はファイル記述子にアクセスできません。クライアントがソケットに接続されているかどうかを確認するにはどうすればよいですか?

私はこのクライアントに現在このポートに接続しているクライアントがあるかどうかを検出したいと考えています。理想的には、クロスプラットフォームのアプローチが必要です(Linux + Mac、* BSDのボーナスポイント)。

私はnetstatがそれを助けることができると知っていますが、私はプログラム的なテクニックを望みます。

+0

Linuxでは、 '/ proc/net/tcp'から読むことができます。 – Sergio

+0

なぜ 'netstat'のソースコードを入手して、それがどうなっているのか見てみませんか? – KevinDTimm

+0

ライブラリ自体ではできない場合は、悪い考えです。私はgstreamerが独自のスレッドを実行していると思いますので、あなたがチェックして応答(0接続)を取得するまでには、実際には新しい接続があるかもしれません。 – viraptor

答えて

1

ライブラリコードは、プロセスのアドレス空間で実行されます。使用するファイル記述子は、getsockopt()を使用してTCP/IPソケットを検索し、次にgetpeername()を使用して接続されているものを見つけることができるint値です。

#include <sys/socket.h> 

// probably better to use getrlimit() here... 
#define MAX_FD 1024 

int tcp_socket_fds[ MAX_FD ]; 
struct sockaddr_in peers[ MAX_FD ]; 

for (int fd = 0; fd < MAX_FD; fd++) 
{ 
    int type; 
    int len = sizeof(type); 

    int rc = getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &len);  
    if ((0 == rc) && (SOCK_STREAM == type)) 
    { 
     tcp_socket_fds[ fd ] = 1; 

     socklen_t socket_len = sizeof(peers[ fd ]); 
     rc = getpeername(fd, &(peers[ fd ]), &socket_len); 

     // zero out the peer if getpeername() failed 
     if (0 != rc) 
     { 
      memset(&(peers[ fd ], 0, sizeof(peers[ fd ])); 
     } 
    } 
    else 
    { 
     tcp_socket_fds[ fd ] = 0; 
    } 
} 

接続されているすべてのTCPは、あなたのプロセスは、チェックの時に開いている、そしてそれはかなり移植する必要がありますソケット見つける:POSIXのドキュメントfor getsockopt()getpeername()あたり。

+0

Mmmh ...私はマンページをかなり解析できません。クライアントがソケットに接続されているかどうかを 'getpeername'は教えてくれるでしょうか? – Yoric

+0

@Yoric 'getpeername()'の目的は、*誰が*ソケットの他端に接続しているかを伝えることです。そうすることで、接続されているかどうかを知ることができます。 –

0

Serhioで拡大しています。あなたは/ procの//ネット/ TCPを開き、それを読んでいる場合は、表示されます:PROC manpageから

sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode              
    0: 0100007F:0CEA 00000000:0000 0A 00000000:00000000 00:00000000 00000000 116  0 14581 1 ffff880406690000 100 0 0 10 0      
    1: 00000000:008B 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 15646 1 ffff880404aa8700 100 0 0 10 0      
    2: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000  0 16859998 1 ffff880406692a00 100 0 0 10 0     
    3: 0100007F:F76E 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000  0 31381008 1 ffff8800d7926200 100 0 0 10 0 
... 

:だから

/proc/net/tcp 
       Holds a dump of the TCP socket table. Much of the information 
       is not of use apart from debugging. The "sl" value is the 
       kernel hash slot for the socket, the "local_address" is the 
       local address and port number pair. The "rem_address" is the 
       remote address and port number pair (if connected). "St" is 
       the internal status of the socket. The "tx_queue" and 
       "rx_queue" are the outgoing and incoming data queue in terms 
       of kernel memory usage. The "tr", "tm->when", and "rexmits" 
       fields hold internal information of the kernel socket state 
       and are useful only for debugging. The "uid" field holds the 
       effective UID of the creator of the socket. 

、これらの行を解析(スキップ最初の行からsscanf)を開き、local_addressフィールドからポート番号を抽出して、目的のポートを探します。stフィールドを調べて、接続状態のソケットを探します。接続された状態で何かを見つけたらtrueを返します。

関連する問題