2009-10-14 32 views
8

Đ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 .)

Trả lời

10

Bạn có thể thực hiện theo cách này.

Khi bạn lưu ý, hãy tắt sau khi chấp nhận là một trẻ cho mỗi khách hàng/kết nối. Ngã ba trước khi chấp nhận (nhưng sau khi nghe) thường được gọi là tiền giả mạo. Mỗi đứa trẻ chờ đợi trên chấp nhận và bất cứ điều gì con được kết nối đến quá trình đó. Điều này là an toàn miễn là chấp nhận được thực hiện bởi hạt nhân (tôi nghĩ) bất kỳ unix hiện đại nào. Nếu không, bạn phải đặt một số loại IPC (mutex, vv) khóa xung quanh chấp nhận. Ưu điểm của tiền đề nghị trước là bạn không cần phải trải qua chi phí của một ngã ba cho mỗi kết nối, bạn đã có một hồ bơi hiện có.

+0

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? –

+6

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

+0

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? –

Các vấn đề liên quan