2015-01-19 30 views
5

COMAND này (serial port redirector) chấp nhận một kết nối duy nhất trên TCP: 11.313:Socat chấm dứt sau khi kết nối chặt chẽ

socat PTY,link=/dev/ttyV1,echo=0,raw,unlink-close=0 TCP-LISTEN:11313,forever,reuseaddr 

Tuy nhiên khi kết nối bị mất, quá trình socat trên là thiệt mạng và khách hàng không có khả năng kết nối.

Tôi có thể giải quyết vấn đề này bằng cách thêm tùy chọn fork ở cuối lệnh trên. Nhưng sau đó nhiều khách hàng sẽ có thể kết nối. Nhưng tôi chỉ muốn chấp nhận một kết nối.

Bất kỳ ý tưởng nào để đạt được điều này?

+0

Có thể ser2net (http://ser2net.sourceforge.net/) là những gì bạn cần? – Maquefel

+0

@Maquefel bạn có trải nghiệm với ser2net không. Đối với tôi có vẻ như họ đang làm khá giống nhau. –

+1

Tôi có - ser2net là một điều đặc biệt nó không thể làm hầu hết những thứ như socat, nó được thiết kế đặc biệt để chuyển tiếp nối tiếp với ethernet. Nhưng nó hoạt động chính xác như bạn muốn - một cổng - một kết nối, không thoát khi kết nối được đóng lại và thông báo kết nối mới đến về cổng đang sử dụng. – Maquefel

Trả lời

7

Bạn có thể hạn chế số lượng trẻ em với max-children tùy chọn:

LISTEN tùy chọn nhóm, tùy chọn cụ thể để ổ cắm nghe

max-con = Giới hạn số tiến trình con đồng thời [int] . Mặc định không có giới hạn.

Với điều này, bạn có thể giới hạn số lượng khách hàng có thể tương tác với PTY thành một, nhưng sẽ không ngăn người khác kết nối. Những người khác sẽ chỉ đơn giản là xếp hàng cho đến khi kết nối đầu tiên được đóng lại. Nếu bạn muốn ngăn chặn điều đó, tôi muốn đề nghị chỉ cần quấn gọi socat trong một vòng lặp while true; do ..; done:

while true; do 
    socat PTY,link=/dev/ttyV1,echo=0,raw,unlink-close=0 TCP-LISTEN:11313,forever,reuseaddr 
done 
+1

tốt hơn để sử dụng 'trong khi ngủ 1; làm ..; thực hiện loop', bởi vì một số shell không thể xử lý chính xác tín hiệu SIGINT trong vòng lặp này, và bạn có thể hoặc không thể ngắt vòng lặp chính xác –

+0

Vì vậy, tôi nên thay thế ".." bằng lệnh socat của mình? –

+1

Có. Tôi đã cập nhật câu trả lời bằng lệnh chính xác. Đoạn mã chạy socat trong một vòng lặp vô hạn, khởi động lại nó ngay lập tức bất cứ khi nào nó thoát. Nếu bạn chưa bao giờ làm việc với họ, hãy xem xét gợi ý của Gabor và thay thế 'true' bằng' sleep 1' cho người mới bắt đầu. – Phillip

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