Tôi khá chắc chắn rằng việc dọn dẹp ổ cắm là một tác dụng phụ của việc giải phóng tất cả các bộ mô tả tệp sau khi quá trình chết và không được thực hiện trực tiếp bởi quá trình dọn dẹp.
Tôi sẽ đi ra ngoài trên một chi, và giả sử bạn đang đánh một điểm chung với lập trình mạng. Nếu tôi đúng khi đoán rằng vấn đề của bạn là bạn nhận được lỗi "Địa chỉ đang sử dụng" (EADDRINUSE) khi cố gắng liên kết với một địa chỉ sau khi quá trình bị giết, thì bạn đang chạy vào TIME_WAIT của socket.
Nếu trường hợp này xảy ra, bạn có thể chờ thời gian chờ, thường là 60 giây hoặc bạn có thể sửa đổi ổ cắm để cho phép sử dụng lại ngay lập tức như vậy.
int sock, ret, on;
struct sockaddr_in servaddr;
sock = socket(AF_INET, SOCK_STREAM, 0):
/* Enable address reuse */
on = 1;
ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
[EDIT]
Từ ý kiến của bạn, Có vẻ như bạn đang gặp vấn đề với các kết nối half-open, và không hoàn toàn hiểu TCP hoạt động. TCP không có cách nào để biết liệu một khách hàng đã chết hay chỉ là nhàn rỗi. Nếu bạn kill -9
một quá trình khách hàng, việc bắt tay đóng bốn chiều không bao giờ hoàn thành. Tuy nhiên, điều này không nên để các kết nối mở trên máy chủ của bạn, vì vậy bạn vẫn có thể cần phải có một bãi chứa mạng để chắc chắn về những gì đang xảy ra.
Tôi không thể chắc chắn cách bạn nên xử lý việc này mà không biết chính xác bạn đang làm gì, nhưng bạn có thể đọc khoảng TCP Keepalive here. Một vài tùy chọn khác sẽ gửi các thông báo rỗng hoặc null định kỳ tới máy khách (có thể yêu cầu sửa đổi giao thức của bạn), hoặc đặt các bộ định thời cứng trên các kết nối không hoạt động (có thể dẫn đến các kết nối không hợp lệ).
Tôi rất tò mò nếu bạn thích câu trả lời và nếu đó là sự cố hạt nhân hoặc sự cố mạng. Ngoài ra, việc cập nhật câu hỏi của bạn sẽ giúp những người khác vấp ngã sau này. – JimB
@JimB, Nếu bạn quan tâm đến vấn đề mạng của chúng tôi, thì không, tôi không biết vấn đề là gì. Chúng tôi đã thêm những kết nối nhàn rỗi này kiểm tra và sử dụng so_keepalive ngay bây giờ, nhưng có rất nhiều lưu lượng truy cập, rất khó để thực hiện lưu lượng truy cập và xác minh xem các gói nhất định có bị mất hay không. Về việc đóng cửa, tôi đã kiểm tra các nguồn mà quán cà phê được đề cập trong câu trả lời của anh ta, và tôi tin rằng hạt nhân Linux ít nhất * cố gắng * để đóng các ổ cắm khi quá trình bị giết. Nếu nó thành công hay không là một câu hỏi khác. –