Я хочу, чтобы клиент связывался с сервером через сокет 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 закончил. Вопрос:
- как я могу поддерживать прослушивание разветвленного (дочернего) процесса doSomething после того, как все данные (TEST1) будут получены и обработаны doSomething?
- если я продолжаю слушать doSomething постоянно, как я могу остановить doSomething, если клиент закрывает соединение?