2016-12-18 4 views
1

私たちのプロジェクトでは、LinuxのTCPソケットを使用しています。サーバはaccept()コールを使用して接続要求を待機しており、クライアントからの接続要求が来ると、サーバはスレッドを作成し、スレッドはクライアントとのさらなる通信を処理します。サーバーがメッセージを送信したクライアント(プロセスID)を判断できる方法があれば、誰にでも教えてください。サーバがTCPソケットプログラミングでメッセージを送信したクライアントを特定する方法

ドライバからのメッセージがあれば、私たちのサーバはそのメッセージをすべてのクライアントにブロードキャストしています。フィールドのバグの1つで、UIがハングアップしていて、UIチームがメッセージを受信しなかったと不平を言っています。しかし、私たちはログを見て、添付されているすべてのクライアントにブロードキャストしています。だからちょうど私たちがメッセージを送信しているプロセスIDを証明したい。

+1

なぜですか?クライアントのプロセスIDを知っていればどんなことができますか? – EJP

+0

クライアントと親の両方が同じホストで実行されていて、同じホストでサーバーとクライアントを使用する必要がない場合にのみ実行できます。 – Anjaneyulu

+0

@Anjaneyulu正しくありません。クライアントのプロセスIDは、すべてが同じホストで実行されている場合は一意ですが、サーバーと同じホストである必要はありません。ただし、プロセスIDは一意の識別子として*を除いては使用できません。 – EJP

答えて

2

いいえ、クライアントのIPアドレスと送信元ポートがあります。ほとんどの場合、これはクライアントの識別に必要な情報ではありません。 LAN以外のすべてのクライアントや一般的にIPアドレスが区別できる(固有のパブリック/プライベートアドレスを持っている)場合は、クライアントのIPアドレスを使用できますが、NATの設定されたクライアントの場合、IPアドレスは同じになります。 クライアントのIPアドレスを持っていても、クライアントを区別するために使用でき、クライアントプロセスIDやクライアントに関連する動的なものは報告されません。

すべてのクライアントが自分のID情報をサーバーに送信するプロトコルを実装する必要があります。これにより、サーバーはその情報を知ります。プロセスIDまたはクライアントに関連するものは、あなたのプロトコルを介して送信することができます。

2

TCPを使用しているため、クライアントがリモートマシン上にある可能性があります。そのため、「プロセスID」を知ることができるかどうかはわかりません。

http://pubs.opengroup.org/onlinepubs/7908799/xns/accept.html

NULLポインタ、またはの アドレスsockaddr構造体へのポインタのどちらか:あなたしかし、クライアントのIPおよびTCPポート番号である見つけることができますどのような

接続ソケットが返されます。

+0

私たちは同じマシンで走っています。 – kadina

+0

OKでも、TCPはローカル接続とリモート接続の両方を処理するように設計されています。 e.jahandarが接続時に 'pid'を送るためのプロトコルを実装することを提案したのはあなたができることです。または、Windowsを使用していて移植性を気にしない場合は、Named Pipesと 'GetNamedPipeClientProcessId'を使用します。 – 599644

1

メッセージをサーバーに送信するたびに、クライアントのPIDを連結して、メッセージを送信したIDを識別できるようにすることができます。サーバーコード内で同じものを開始してデコードすることができます。 この場合、Linux環境でselect APIを使用してすべてのファイル記述子を監視することをお勧めします。一意のファイル記述子に基づいてクライアントを識別できます。あなたの問題を解決するかもしれない 見てくださいhere

関連する問題