Không, đây là giới hạn của các ổ cắm C bên dưới (và giao thức TCP/IP, cho vấn đề đó). Câu hỏi của tôi với bạn là: tại sao bạn tắt chúng khi bạn có thể kiến trúc ứng dụng của bạn sử dụng chúng?
Vấn đề với nhiều ổ cắm ngắn hạn là tắt chúng đi trong trạng thái không thể sử dụng được một thời gian (về cơ bản, gấp đôi thời gian gói, để đảm bảo bất kỳ gói nào trong mạng đến và bị loại bỏ hoặc bị hủy bỏ bởi chính mạng). Về cơ bản những gì xảy ra là, trong bộ 4 cần phải là duy nhất (nguồn ip, cổng nguồn, ip đích, cổng đích), cái đầu tiên và cuối cùng có xu hướng luôn giống nhau, khi bạn hết nguồn cổng, bạn đang hosed.
Chúng tôi đã gặp vấn đề này trong phần mềm trước khi nó chỉ trở nên rõ ràng khi chúng tôi chạy trên các máy nhanh hơn (vì chúng tôi có thể sử dụng nhiều phiên hơn).
Tại sao bạn không chỉ mở ổ cắm và tiếp tục sử dụng? Có vẻ như giao thức của bạn là một yêu cầu/phản hồi đơn giản, nên dễ dàng thực hiện được với phương pháp đó.
Cái gì như:
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
for i in range(nb):
sck.send('question %i'%i)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
Cập nhật:
Một khả năng (và chúng tôi đã làm điều này trước đó) nếu bạn đang chạy ra khỏi kết nối do mở liên tục này/đóng, là để phát hiện vấn đề và điều tiết nó. Xét đoạn mã sau (những thứ tôi đã thêm là pseudo-code hơn Python kể từ khi tôi đã không đụng Python cho khá trong một):
for i in range(nb):
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
while sck.error() == NO_SOCKETS_AVAIL:
sleep 250 milliseconds
sck.connect((adr, prt)
sck.send('question %i'%i)
sck.shutdown(SHUT_WR)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
Về cơ bản, nó cho phép bạn chạy ở tốc độ cao trong khi có nhiều tài nguyên nhưng chậm lại khi bạn tấn công khu vực sự cố của mình. Đây thực sự là những gì chúng tôi đã làm cho sản phẩm của chúng tôi để "sửa chữa" vấn đề thất bại khi tài nguyên thấp. Chúng tôi sẽ tái cấu trúc nó ngoại trừ thực tế nó là một sản phẩm kế thừa gần cuối đời và chúng tôi về cơ bản ở chế độ sửa chữa với chi phí tối thiểu cho dịch vụ.
Tôi ước mình có thể làm điều đó, nhưng tiếc là tôi phải tắt ổ cắm (hoặc ít nhất là "tắt máy một nửa") nếu không thì khối cuộc gọi gửi và tôi sẽ không bao giờ nhận được câu trả lời. Tôi đoán rằng nếu tôi không tắt ổ cắm, máy chủ không biết tôi đang thực hiện gửi dữ liệu và chờ đợi một số chi tiết. – dugres
Bạn sẽ phải viết lại máy chủ sau đó để làm cho nó sử dụng một cách tiếp cận "hợp lý" hơn dựa trên các dấu phân cách trong luồng dữ liệu (ví dụ). Nhưng có một khả năng khác - hãy xem bản cập nhật của tôi về cách tiếp cận mà chúng tôi đã thực hiện để giải quyết vấn đề. – paxdiablo
@pax: Tôi đã triển khai giải pháp của bạn và nó hoạt động rất tốt cho bất kỳ "nb" nào. Cảm ơn nhiều. – dugres