2009-06-25 8 views
8

Khi tạo một Socket trong Java:Làm thế nào để xem/thay đổi thời gian chờ kết nối socket trên Linux?

new Socket(host, port); 

Các constructor Socket sẽ cố gắng để kết nối với host: port trước khi trở về. Trên Windows, điều này không thành công ngay lập tức đối với các máy chủ không thể truy cập nhưng đối với Linux, có thể mất tới 5 phút để Socket hết thời gian chờ.

Tôi biết rằng nếu tôi có thể kiểm soát việc tạo ra các ổ cắm, tôi có thể làm:

Socket s = new Socket(); 
s.bind(..); 
s.connect(.., timeout); 

nhưng tôi thà có hệ điều hành sử dụng một giá trị mặc định hợp lý. Có cách nào để thay đổi cài đặt này trên Linux không?

Cảm ơn

+0

Tôi nghĩ nên định cấu hình thời gian chờ này trong từng cơ sở ứng dụng. Nếu không, tất cả các ứng dụng khác chạy trong máy này sẽ bị ảnh hưởng bởi cài đặt này. – Reginaldo

+1

Đồng ý, tôi vẫn muốn biết tôi nên thay đổi cài đặt nào. – Kevin

+1

Nếu bạn nhấn mạnh vào việc thay đổi các thiết lập hệ điều hành sau đó tôi nghĩ rằng đây không phải là một câu hỏi liên quan đến lập trình nữa và thuộc về Lỗi máy chủ. – akarnokd

Trả lời

7

Tôi nghĩ bạn muốn /proc/sys/net/ipv4/tcp_syn_retries. Mặc định thường là 5 hoặc 6, khoảng 3 phút.

Lưu ý rằng đây là toàn hệ thống.

+0

Thời gian giữa mỗi lần thử lại như thế nào? Dường như tăng theo cấp số nhân với mỗi lần thử lại. Bộ này ở đâu? – Kevin

+0

Khoảng thời gian tăng, ít nhất là tới một điểm. Trí nhớ của tôi đang thất bại ở đây. Tôi không nhớ nếu đó là điều BSD hoặc TCP và tôi không chắc chắn nếu Linux cung cấp cho bạn một cách để kiểm soát nó. – Duck

+4

Khoảng thời gian được kiểm soát bởi các giá trị được gọi là rtoMin, rtoMax và rtoInitial trong đó rto là viết tắt của Time Tripout. Về cơ bản, nó biểu thị thời gian cần cho một gói để thực hiện một chuyến đi khứ hồi. Vì vậy, nếu khi TCP gửi thông điệp đầu tiên, nó sẽ đợi thời gian rtoInitial. Nếu nó không nhận được một phản ứng, nó sẽ tăng gấp đôi rto (và thêm một số giá trị jitter) và sau đó thử lại. Điều này sẽ tiếp tục cho đến khi maxRetries. Giá trị rto hiện tại sẽ không bao giờ đi qua rtoMax. –

0

Đó là sự hiểu biết của tôi rằng điều này phụ thuộc vào thời gian chờ mặc định giao thức TCP/IP của hệ thống (240 giây theo mặc định?) ... một lựa chọn là cố gắng tinh chỉnh đó, tuy nhiên điều này có thể ảnh hưởng đến bất kỳ chương trình khác trên cùng một máy dựa trên giá trị thời gian chờ. Trong trường hợp đó, có thể an toàn hơn nếu chỉ đơn giản là giảm giá trị "timeout" trong cuộc gọi kết nối Java() của bạn, thay vào đó.

4

Tôi khuyên bạn không nên thay đổi cài đặt OS vì nó có thể ảnh hưởng bất ngờ đến các ứng dụng khác. Phương pháp Socket.setSoTimeout() cũng có thể giúp bạn.

+2

Tôi có thể hỏi lý do không cho downvote vì vậy tôi có thể học hỏi từ nó? – akarnokd

+2

Tôi nghĩ rằng SO_TIMEOUT áp dụng để đọc nhưng không kết nối, vì vậy đó có thể là lý do tại sao. Tôi không thể tìm thấy xác minh điều này vào lúc này. –

2

BTW không hoàn toàn chính xác, Linux và Windows hoạt động ở đây khác nhau. Bên cạnh các thử nghiệm SYN ban đầu (có thể được cấu hình trên Linux và Windows), trạng thái lân cận cũng như các bộ định tuyến khác gửi các gói RST cũng đóng một vai trò.

Nếu nỗ lực kết nối trên Windows không thực hiện được thì có khả năng máy tính đã bị RST bởi một bộ định tuyến hoặc hàng xóm được nhận dạng là không thể truy cập được ở cấp ARP. Hãy thử lệnh arp -a -v trên Windows để xem các máy chủ không thể truy cập - bị từ chối nhanh chóng.

Đối với Linux, bạn sẽ sử dụng ip neigh để liệt kê trạng thái khả năng hiển thị của các trạm trên mạng cục bộ của bạn.