Всё идёт хорошо, пока подключаются новые клиенты. Но как только один из них завершит соединение, следующий вызов accept() завершится ошибкой: "Interrupted system call". Помогите? Почему так происходит?
Полный код ниже.
| Код | int port = 3434; int ls = socket(AF_INET, SOCK_STREAM, 0);
if (ls < 0) throw Server_Exception("Ошибка создания сокета"); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = INADDR_ANY; int opt = 1; setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); int bind_status = bind(ls, (struct sockaddr *) &addr, sizeof(addr)); if ( bind_status < 0 ) throw Server_Exception("Ошибка функции bind()"); int listen_status = listen(ls, 5); if ( listen_status < 0 ) throw Server_Exception("Ошибка функции listen()");
while (true) { printf("Waiting for connections...\n");
int cs = accept(ls, NULL, NULL); if (-1 == cs) throw Server_Exception("accept"); switch(fork()) { case -1: throw Server_Exception("fork"); case 0: close(ls); while(1) { int bytes_read = recv(sock, buf, 1024, 0); if (bytes_read <= 0) break; send(sock, buf, bytes_read, 0); } shutdown(cs, 2); close(cs); exit(0); default: close(cs); } }
|
|