Как повторно использовать открытое клиентское соединение с разветвленным дочерним процессом на сервере (TCP / IP Socket) - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу, чтобы клиент связывался с сервером через сокет TCP / IP. Когда соединение принято на стороне сервера, создается дочерний процесс. Этот дочерний процесс читает и обрабатывает входящие данные. Я подумал, что когда я делаю последующие записи от клиента, при открытом соединении, что серверная сторона снова выполнит разветвление, если процесс doSomething уже завершился. Однако, что происходит, 2-я запись клиента (TEST2) пишет в сокет и:

а) запись не указывает на ошибку, но сервер ничего не получает или

б) исключение разбитая труба

У меня есть такой псевдокод:

Client socket side:
{

    socketFD = socket(AF_INET, SOCK_STREAM, 0);
    connect(socketFD, (struct sockaddr *) &serv_addr, sizeof(sockaddr));
    write(socketFD, “TEST1”, strlen(“TEST1”));
    …….
    write(socketFD, “TEST2”, strlen(“TEST2”)); // error: Broken pipe

    .....
    close(sfd);

}

Сторона сокета сервера: doSomething запущен на разветвленном дочернем процессе:

void doSomething(int socket)
{  

    int n;
    const int bufferSize = 1025;
    char buffer[1025];

    bzero(buffer,bufferSize);
    n = read(sock,buffer,bufferSize-1);

}

Запись для «TEST2» завершится ошибкой с сообщением «сломанный канал». Это, вероятно, потому что doSomething закончил. Вопрос:

  1. как я могу поддерживать прослушивание разветвленного (дочернего) процесса doSomething после того, как все данные (TEST1) будут получены и обработаны doSomething?
  2. если я продолжаю слушать doSomething постоянно, как я могу остановить doSomething, если клиент закрывает соединение?

1 Ответ

0 голосов
/ 02 ноября 2018
void doSomething(int socket)
{  

    int n;
    char buffer[1024];
    do
    {
        //Normally your process will be blocked here until it receives some data from the client.
        //The socket must be under the blocking mode;
        n = read(sock,buffer,sizeof(buffer));
        ...do something with the buffer;
    }while(n>0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...