2011-01-26 3 views
0

Мне нужно идентифицировать уникальный идентификатор Socket. Это правильный способ использования дескриптора сокета? Является ли дескриптор сокетов уникальным?Как идентифицировать (или подключать) идентификатор пользователя с входящим сокетом?

Например

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

Когда происходит новое соединение, я должен сохранить некоторую вещь uniq в объекте. Посмотрите на образец. В новом слоте подключения я создаю объектные пользовательские и соединительные сигналы и слоты. В sloReadClient я хочу что-то изменить в объекте пользователя. Например (абстрактный код) QString name = read (socket); user-> SetName (имя); Но как определить сокет? У меня есть множество пользователей и нужно изменить нужный объект – Lunatik

ответ

2

Торцевые идентификаторами (которые на самом деле файл дескрипторы) являются мгновенно уникальным в течение своей жизни. Значение следующее:

int my_fd socket(...); 

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

close(my_fd); 

Я не уверен, что специфика того, что вы подразумеваете под идентификатором пользователя, я думаю, что это не будет работать, потому что, если тот же пользователь подключается дважды, они будут иметь разные FDS (наверное). Однако, если вам просто нужен способ идентифицировать текущие соединения и не выполнять идентификацию на разных уровнях, то это именно то, как это должно быть сделано.

Смежные вопросы