2011-06-07 4 views
1

Более одного клиентского процесса отправляет сообщения на сервер и получает сообщения по очереди. Один клиентский процесс отправляет на сервер несколько сообщений. Теперь клиентский процесс подключается к серверу каждый раз, когда сообщение отправляется, а сообщения из разных клиентских процессов поступают чередованием по серверу.Программирование сокетов в C

Как я узнаю клиента? Я имею в виду, имеет ли клиентский процесс значение идентификатора на сервере и является ли он одинаковым для процесса, хотя он подключается несколько раз.

Благодаря

ответ

0

Там нет никакого способа, если вы не имеете протокол более высокого уровня. Как только сокет закрыт, клиент ушел.

2

Для связи по соединению необходимо accept(2) это соединение. Что принимает нас?

int accept(int socket, struct sockaddr *restrict address, 
     socklen_t *restrict address_len); 

Адрес является «идентификацией» соединения. Так что в принципе вы можете сделать это следующим образом:

  • Когда кто-то соединяется, запись сокета (это то, что accept(2) возвращается) и его адрес
  • Когда вы получаете что-то через сокет (вы можете использовать выбор/Epoll и т.д.) выполните поиск по вашему списку и найдите соответствие между сокетом и адресом.

Теперь, колючая проблема: как мне сравнивать адреса? Сравните каждое интересное поле для вашего протокола (для обычного случая с протоколом TCP я бы сравнил IP-адрес и порт).

Как только соединение будет установлено, вы захотите «аутентифицировать» пользователя в некотором роде. Если аутентификация удалась, вы можете добавить эту «информацию» к идентификатору в списке подключенных клиентов.

+0

Не совсем. Как только соединение будет закрыто, другое может быть создано с использованием другого порта. И не используйте только IP (думаю, прокси, подумайте о нескольких клиентах в одном окне) – cadrian

+0

@cadrian Я не был выполнен :-) – cnicutar

+0

ok .... fine :-) – cadrian

2

Чтобы идентифицировать клиентов в вашей настройке, вам необходимо, чтобы каждый клиент отправлял какую-либо форму идентификации как часть каждого сообщения.

Насколько я могу судить, нет другого надежного способа, так как у вас есть новое соединение, установленное каждый раз, когда клиент хочет поговорить с сервером.

3

Если вы не в порядке с идентификацией только по IP-адресу клиента, вам нужно будет добавить какой-то токен в сообщение. Вы можете (например) добавить сообщение в начало разговора, которое запрашивает уникальный токен, а затем требует, чтобы один и тот же токен отправлялся в каждом сообщении от этого клиента.

+0

+1 что ОП запрашивает связано с протокол приложения, а не на сокет-программирование как таковое. – Simone

+0

Я думаю, это может быть идентификатор процесса клиента –

0

Я думаю, что ваша мысль права.

Сервер и клиент должны иметь уникальный идентификатор друг друга, если клиент может подключаться несколько раз.

Если клиент не может подключиться несколько раз, сервер может идентифицировать возвращаемое значение каждого принимающего клиента (2); однако в вашем случае клиентам требуется несколько подключений, поэтому вам нужно разработать свой собственный протокол для идентификации каждого клиента.

В моем случае, в предыдущем проекте, я сделал UUID перед подключением сервера, и я использовал UUID в качестве идентификатора клиента. В Mac OS X или Linux вы можете включить заголовочный файл, который находится в /usr/include/uuid/uuid.h.

#include <uuid/uuid.h> 

... 
{ 
    uuid_t id; 
    uuid_generate(id); 
    ... 
} 

Затем вы можете получить случайное 128-битное значение в 'id'. Я использовал этот UUID как идентификаторы клиентов. Может быть лучший способ определить каждого клиента.

0

Если вам нужен сервер для распознавания клиента, лучшим решением должно быть внедрение процесса аутентификации. Любое другое решение может полагаться на фактическое установленное соединение (но это не работает, если соединение закрыто) или на IP-адрес клиента (но это не работает, если есть больше клиентов с тем же адресом или если адрес меняется).

Клиент может быть аутентифицирован на сервере с использованием имени пользователя и пароля. Если клиент и сервер используют ключ, каждое обмениваемое ими сообщение может быть аутентифицировано знаком. Таким образом, сервер может идентифицировать отправителя, несмотря на IP-адрес принятого пакета.

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