UTP-чат-сервер в с - PullRequest
       7

UTP-чат-сервер в с

0 голосов
/ 17 ноября 2010

Я пытаюсь написать чат-сервер udp на языке c. Я написал сервер чата TCP ранее, и это нормально.

на сервере tcp функция accept возвращает номер fd, а сервер связывается с конкретным клиентом в соответствии с этим номером fd.

но в udp, как я могу прослушать определенного клиента?

На моем tcp-сервере после подключения клиента к серверу создается поток, который прослушивает этот клиент. Таким образом, для каждого клиента есть поток, который прослушивает в соответствии с номером fd, который возвращается из функции accept. поэтому любое сообщение может быть отправлено в соответствии с этим номером для конкретного клиента.

Как мне добиться этого на сервере udp?

Спасибо за ответы.

Ответы [ 4 ]

1 голос
/ 25 октября 2011

Это очень просто. Как вы знаете, UDP не использует соединения, он может использовать один и тот же порт. Так что идея здесь. Просто создайте поток для каждого клиента. Будет замечательно, если у вас будет больше процессорного ядра. Вы можете использовать каждое ядро ​​для определенного количества клиентов. (Это может быть сделано с помощью map ). Теперь, когда тот же клиент снова стучит, просто отправьте его в этот поток и ядро. Итак, если у вас есть 1 ... n ядро, вы должны создать n поток с настройкой cpu в каждая нить.

Я провел эксперимент с 8-ядерным сервером, и он работал нормально.

Я дам этот код в своем блоге через несколько дней после проверки его на гигабитный коммутатор ..:)

matrixsust.blogspot.com

Надеюсь, это поможет.

1 голос
/ 17 ноября 2010

Вы используете recvfrom, чтобы узнать IP-адрес / порт источника, а затем ответите sendto.Вам нужно только bind, чтобы выбрать порт сервера.Вы не accept.Все, что connect делает для UDP, является назначением по умолчанию (которое вы планируете переопределить с помощью sendto).

0 голосов
/ 17 ноября 2010

Я использовал функции recvfrom и sendto.Сначала клиент отправляет сообщение на сервер с помощью sendto.и сервер принимает сообщение по recvfrom.В recvfrom я беру адрес клиента через структуру sockaddr_in.После того, как я не могу достичь связать это и использовать sendto

0 голосов
/ 17 ноября 2010

Просто создайте сокет UDP и вызовите connect ().Но ты не хочешь этого делать.Вся радость UDP-серверов в том, что им нужен только один сокет.Подумай об этом.Вам нужен только поток в TCP, потому что вы вынуждены иметь выделенный сокет, а выделенный поток - самый простой (и не единственный) способ его обработки.В UDP вы можете продолжать чтение из одного и того же сокета, а адрес источника говорит вам, с какого клиента поступает каждая диаграмма.

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