Проверьте, открыт ли сокет в Linux - PullRequest
0 голосов
/ 21 июля 2009

У меня есть серверная программа linux, которая ожидает входящих соединений от клиента и в зависимости от того, какую команду вы отправляете, выполняет другое соединение. Вот псевдокод

setup_socket();

while(1)
{
   listen();
   newfile_descriptor = accept();
   int command
   read(newfile_descriptor,&command,sizeof(int));
   switch(command)
   {
      ...
   }
}

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

Ответы [ 6 ]

2 голосов
/ 22 июля 2009

Вы либо демультиплексируете сокет ввода-вывода с помощью select / poll, либо имеете отдельный поток для чтения команд на клиентском сокете.

2 голосов
/ 21 июля 2009

Как насчет цикла, в котором вы читаете команды:

setup_socket();

while(1)
{
   listen();
   newfile_descriptor = accept();
   int command
   command = read(newfile_descriptor,&command,sizeof(int));
   while(command) {
     switch(command)
     {
        ...
     }
     // get next command, or figure out closed connection
     command = read(newfile_descriptor,&command,sizeof(int));
  }
}
1 голос
/ 16 марта 2011

Самое первое, что ... Это переместить ваш listen () вне цикла while. : Р

1 голос
/ 22 июля 2009

Чтобы уточнить ответ Николая, ознакомьтесь с необходимыми инструкциями Биджа . Это очень стандартная практика - создавать новый поток сразу после вызова accept () внутри вашего цикла while (1); этот поток обрабатывает все коммуникации с клиентом, так что основной поток может продолжать прослушивать () новые входящие соединения и принимать (), когда они приходят.

Здесь - это определенный раздел о select (), о котором я знаю, но на самом деле раньше не использовал.

1 голос
/ 21 июля 2009

Вам нужен некоторый базовый протокол, который позволяет клиенту сообщать вам, что он завершил отправку команд. Это может быть так же просто, как клиент продолжает отправлять команды, а затем закрывает сокет, когда ему больше не нужно отправлять. В этом случае вы просто продолжите чтение из сокета, пока он не закроется. В вашем псевдокоде это будет выглядеть примерно так:

setup_socket();

while(1) {
    listen();
    newfile_descriptor = accept();

    int command;
    do {
        command = read(newfile_descriptor,&command,sizeof(int));

        if (command > 0) {
            switch(command) {
                ...
            }
       }
    } while (command > 0);
}
1 голос
/ 21 июля 2009

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

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