2016-12-26 5 views
1

すでに接続設定を持つ関数に渡されたsocket.socketインスタンスは、サーバー側のソケット(socket.accept()を実行した)があるかsocket.connect()を実行し、クライアント側ソケット(あるかどうかを検出する方法はあります。Pythonのsocket.socketインスタンスが事前に知らなくても、サーバーかクライアントかを検出しますか?

基本的に私は」 is_server_socketが以下で使用されている実装するためのソケットについてチェックするために何かを探してメートル:接続されていないソケットがピアを持たないながら

def func(sock): 
    if is_server_socket(sock): 
     print("I'm a server!") 
    else: 
     print("I'm a client!") 
+1

UDPを使用している場合、サーバーソケットまたはクライアントソケットの概念はありません。 TCPを使用している場合、おそらくコードのロジックをチェックする必要があります。なぜなら、サーバーソケットまたはクライアントソケットのいずれかを取りますが、その2つを区別する機能はほとんど意味がないからです。 –

+0

@ValentinLorentz TCPだけです。私が作成しているインターフェイスでは、HTTP/2と同じような「ストリームID」を使用し、ストリームIDの重複を避けるために、クライアントまたはサーバーインスタンスを奇数または偶数のストリームIDにします。私のインターフェースは外部コードを何も知らず、ソケットだけが渡されます。私の質問には質問しないでください。代わりに、回答があればそれに気をつけてください。 –

答えて

0

接続されたソケットは、ピアを持ってこのようにあなたは区別するためにgetpeernameを使用することができます。接続されていて接続されていないソケット

接続されていないすべてのソケットがサーバーソケットであるわけではありません。単に接続されていないソケット(つまり、ソケットが作成されていても接続されていない)でもかまいません。しかし、受け入れることができるソケットとgetpeernameよりも受け入れの結果として得たソケットを区別するだけで十分な場合は、十分です。それでも、この情報はシステムコールであり、したがって比較的高価なので、常にgetpeernameを呼び出すのではなく、ローカル変数にこの情報を保持する方が良いでしょう。

関連する問題