C / Linux TCP Socket Server - PullRequest
       2

C / Linux TCP Socket Server

1 голос
/ 07 февраля 2012

Я внедряю сервер сокетов TCP в C и Linux.Это будет чат-сервер, обрабатывающий много запросов одновременно.Вот псевдокод для его настройки

create a socket
bind to a well-known port
use listen to place in passive mode
while (1)
{
    accept a client connection
    fork
    if (child)
    {
        communicate with new socket
        close new socket
        exit
     }
 else
 {close new socket}
}

Из того, что я видел, часть «связь с новым сокетом» состоит из чтения буфера и последующей записи в буфер, затем сокета.закрывается.Я думал, что сокеты должны быть постоянным соединением?Если клиенту приходится переподключаться каждый раз, когда он хочет отправить больше данных на сервер, не является ли это неэффективным и наносящим ущерб назначению сокетов?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Если клиенту приходится переподключаться каждый раз, когда он хочет отправить больше данных на сервер, не является ли это неэффективным и наносящим ущерб назначению сокетов?

Невозможно сказать, не зная больше о характере вашего приложения:

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

  • В других случаях подключение к каждому сообщению также будет работать хорошо.

Вы совершенно правы в плане эффективности: при установлении TCP-соединения довольно много накладных расходов. Поэтому, если сообщения являются частыми, может оказаться очень дорогостоящим установить новое соединение для каждого сообщения.

2 голосов
/ 07 февраля 2012
  1. Не закрывайте розетку. Поместите код, который получает и отвечает на сообщения в цикле и использует блокировку ввода / вывода (по умолчанию) для блокировки чтения сокета до тех пор, пока не поступит запрос. Таким образом, вы получите раздвоенный процесс, работающий с каждым клиентом и использующий минимальные ресурсы. Вы только закрываете сокет и выходите из дочернего процесса, когда клиент явно закрывает соединение, потому что это сделано.

  2. Использовать UDP вместо TCP. Таким образом, нет «связи» между сервером и клиентом. Вы объединяете несколько клиентов в один сокет без разветвления. Если вы заботитесь о надежности, вам нужно добавить порядковый номер к каждому сообщению, чтобы они оставались прямыми и позволяли повторную передачу при сбоях.

  3. Сохраните один процесс, используя TCP, но сохраните набор дескрипторов сокетов и используйте , выберите , чтобы проверить наличие читаемых сокетов. Затем вы можете повторно передать эти данные на каждый или на некоторые другие клиентские сокеты.

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

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