2011-01-26 6 views
0

Socketの一意のIDを特定する必要があります。それはソケット記述子を使う正しい方法でしょうか? ソケット記述子は一意ですか? (実際のファイル記述子である)着信ソケットでユーザーIDを特定(または接続)する方法はありますか?

例えば

QTcpSocket* pClientSocket = nextPendingConnection(); 
int id = pClientSocket->socketDescriptor(); 
User user(id); 

/*...*/ 

void slotReadClient(){ 
socket = (QTcpSocket*)sender(); 
user = users.find(socket->socketDescriptor()); 
user->doAny(); 
} 
+0

私はここで何かを誤解しているかもしれませんが、ローカルで(つまりプロセス内で)固有の識別子を探していますか?ソケット記述子は、ソケットが閉じられていない限り有効です – Hasturkun

+0

新しい接続が発生すると、オブジェクト内にいくつかのユニークなものを保存する必要があります。サンプルを見てください。新しい接続スロットでは、私はオブジェクトのユーザーとconnecti信号とスロットを作成します。 sloReadClientでは、私はユーザーオブジェクト内の何かを変更したい。例えば(抽象コード)QString name = read(socket); user-> setName(name);しかし、どのようにソケットを識別する?私はユーザーの配列を持っており、必要なオブジェクトを変更する必要があります – Lunatik

答えて

2

ソケットIDを生涯にわたって瞬時にユニークです。次のことを意味:

int my_fd socket(...); 

/* during this time no calls to socket will ever return my_fd */ 

close(my_fd); 

私はあなたがユーザIDで何を意味するかの詳細は、私は同じユーザーが二回接続している場合、彼らは(おそらく)別のFDSを持つことになりますので、これは動作しないだろうと考えてよく分かりません。しかし、単に現在の接続を識別する方法を必要とし、セッション間でIDの永続性を保持しない場合は、これが正確にどのように行われるべきかです。