TCP Socket: структура кода сервера / клиента - PullRequest
0 голосов
/ 06 ноября 2011

Скажем, я хочу иметь программу на C, которая делает это: 1. Пользователь запустит клиент со строкой ввода, например, 'abc' 2. Сервер получит строку и сделает ее заглавной, а затем вернет «ABC» 3. Клиент НЕ будет отключен, но он может ввести больше строки в командной строке, чтобы получить результат. 4. Несколько клиентов (до 5) могут быть подключены одновременно.

Как выглядит структура кода для сервера? Вот что я получил:

master_socket = socket();
bind();
listen();

while(true)
{
     **int newsockfd = accept();
     if (newsockfd < 0)
         //server keeps coming to here
         continue; //no new connection
     else
     {**
        int pid = fork();

        if (pid == -1) {      /* fork() failed */
            perror("fork");
            exit(EXIT_FAILURE);
        }
        //parent
        if (pid > 0)
        {
            close(newsockfd);
            waitpid(pid, NULL, WNOHANG);
        }
        else
        {
            close(master_socket);
            //receive input string
            receive();
            modify();
            //send back string
            send();

        }
        //close(newsockfd);  **//not sure where to put**

     }

}

В частности, я не знаю, куда ставить close (newsockfd) и как использовать accept в этом случае.

Сервер сейчас просто продолжает идти дальше. Когда будет новое соединение, оно ответит правильно. Но он игнорирует любого существующего клиента, который хочет что-то отправить снова.

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

Большое спасибо.

1 Ответ

0 голосов
/ 06 ноября 2011

Дочерний процесс должен выполнить цикл обработки ввода и не должен возвращаться к accept (): в EOS он должен закрыть принятый сокет и выйти.

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