Đoạn mã sau tạo 4 quy trình, tất cả đều chia sẻ cùng một ổ cắm nghe.Ngã ba trước hoặc sau khi chấp nhận kết nối?
Có nguy hiểm nào khi thực hiện việc này không? Tôi có nên luôn luôn có một quá trình lắng nghe và ngã ba sau khi kết nối được chấp nhận, theo cách thông thường?
for (p = 0; p < 3; p++) {
pid = fork();
if (pid == 0) break;
}
while (1) {
unsigned int clientlen = sizeof(echoclient);
/* Wait for client connection */
if ((clientsock =
accept(serversock, (struct sockaddr *) &echoclient,
&clientlen)) < 0) {
die("Failed to accept client connection");
}
fprintf(stdout, "Process No. %d - Client connected: %s\n",
p,
inet_ntoa(echoclient.sin_addr));
handle_client(clientsock);
}
(Tôi hiểu rằng forking sau khi chấp nhận cho phép một chương trình để thực hiện một quá trình cho mỗi kết nối. Tôi đang chơi xung quanh với proto-đề và các công cụ async khác nhau, vì vậy tôi chỉ nhìn vào có một quá trình cho mỗi lõi .)
Tôi mặc dù đó là nhiệm vụ hạt nhân thr để thực hiện chấp nhận kết nối tcp phía sau mui xe (còn gọi là cách xử lý cây lắc) trong lớp TCP. Tôi chắc chắn không có loại IPC nào là cần thiết ở đây. Có ai trên SO biết một platorm ở đâu? –
Theo Stevens, hạt nhân của BSD luôn làm điều đó. Một số hệ thống SysV cũ hơn được chấp nhận trong thư viện và yêu cầu khóa. Đó là nghi ngờ bất cứ ai đang chạy một hệ điều hành sản xuất cũ nhưng tôi cho rằng bạn không bao giờ biết. – Duck
Chúng tôi không cần setsockopt (server_fd, REUSEPORT) trên Linux nếu chúng tôi sử dụng tiền ngã ba, phải không? –