Bạn có thể an toàn/an toàn để close()
ổ cắm trực tiếp sau send()
cuối cùng không?close() cắm trực tiếp sau khi gửi(): không an toàn?
Tôi biết rằng TCP có nhiệm vụ cố gắng phân phối tất cả dữ liệu còn lại trong bộ đệm gửi ngay cả sau khi đóng socket, nhưng tôi có thể thực sự dựa vào đó không?
Tôi đảm bảo rằng không có dữ liệu còn lại trong bộ đệm nhận để không có RST nào được gửi sau khi đóng.
Trong trường hợp của tôi, lệnh đóng thực sự là mã cuối cùng trước khi gọi exit()
.
Ngăn xếp TCP thực sự tiếp tục thử và truyền dữ liệu ngay cả sau khi quá trình gửi nó đã chấm dứt? Đó có phải là đáng tin cậy như chờ đợi một thời gian chờ tùy ý trước khi gọi close()
bằng cách đặt SO_LINGER?
Tức là, làm cùng thời gian chờ TCP áp dụng hoặc chúng ngắn hơn? Với bộ đệm gửi lớn và kết nối chậm, thời gian thực sự chuyển tất cả dữ liệu đệm có thể đáng kể.
Tôi không quan tâm đến việc được thông báo về byte cuối cùng đã gửi; Tôi chỉ muốn họ cuối cùng đến được máy chủ từ xa một cách đáng tin cậy nhất có thể.
Xác nhận lớp ứng dụng không phải là một tùy chọn (giao thức là HTTP và tôi đang viết một máy chủ nhỏ).
Nó phụ thuộc vào việc thực hiện, nhưng nói chung, có, 'close()' sẽ xóa bất kỳ dữ liệu nào còn lại trong bộ đệm trước khi nó thực sự rơi xuống ổ cắm. Mileage có thể thay đổi nếu bạn chấm dứt toàn bộ quá trình ngoài việc gọi 'close()'. – aroth
@aroth Mileage sẽ * không * thay đổi nếu bạn thoát khỏi quá trình. Không có sự khác biệt giữa hai trường hợp. Nếu bạn muốn duy trì điều ngược lại, vui lòng cung cấp một tài liệu tham khảo có thẩm quyền. – EJP
@EJP - Tham chiếu có thẩm quyền về những gì * có thể xảy ra trong các chương trình tùy ý? Tôi không nghĩ một thứ như vậy tồn tại. Nhưng nó đủ đơn giản để đưa ra một ví dụ hợp lý. Giả sử bạn có một chương trình ủy nhiệm tất cả các hoạt động mạng cho một luồng riêng biệt, giống như hầu hết các chương trình nên. Có thể cho chủ đề chính để chấm dứt quá trình (duyên dáng hoặc cách khác) trong khi chủ đề nền đang gọi 'close()'. Cuộc gọi có thành công trong trường hợp đó không? Tôi nghi ngờ điều đó. Cấp, những gì bạn nói nên giữ đúng cho bất kỳ chương trình đơn luồng. Nhưng không phải tất cả các chương trình đều đơn luồng. – aroth