วิธีการทำให้โซคอตมีชีวิตอยู่โดยใช้ตัวเลือก keepalive


10

ฉันมีคำสั่ง socat ที่ทำงานได้ดี แต่เมื่อไม่มีการถ่ายโอนข้อมูลมันกำลังจะตายหลังจาก 5 นาทีและฉันไม่เข้าใจว่าทำไมเพราะฉันตั้งค่าให้ส่ง 100 keepalive ทุก 10 วินาทีหลังจาก 10 วินาทีแรก . จากสิ่งที่ฉันเข้าใจเกี่ยวกับหน้า man socat ที่ควรจะมีชีวิตอยู่เป็นเวลา 1000s คือ 16 นาที นอกจากนี้ถ้าฉันพยายามตั้ง keepcnt เป็น 200 ฉันจะได้รับ "setsockopt (7, 6, 6, {200}, 4): อาร์กิวเมนต์ไม่ถูกต้อง" แต่ไม่มีที่ไหนบนอินเทอร์เน็ตฉันจะหาค่าสูงสุดสำหรับอาร์กิวเมนต์นั้นได้อย่างไร ฉันต้องคิดถึงบางสิ่งที่ชัดเจนมากที่นี่ การทดลองเพิ่มเติมกับข้อโต้แย้งไม่เคยเปลี่ยนค่าการหมดเวลาของ 5mn การตั้งค่าที่ต่ำกว่าสำหรับ keepcnt และค่าที่สูงกว่าของ keepintvl นั้นเป็นที่ยอมรับ แต่ไม่มีผลกระทบที่มองเห็นได้

socat -d -d -d -v pty,link=/tmp/lp1 tcp:192.168.0.5:9100,reuseaddr,keepalive,keepidle=10,keepintvl=10,keepcnt=100
2017/05/31 08:53:01 socat [16065] I ผลิตภัณฑ์นี้มีซอฟต์แวร์ที่พัฒนาโดยโครงการ OpenSSL สำหรับใช้ใน OpenSSL Toolkit (http://www.openssl.org/)
2017/05/31 08:53:01 socat [16065] I ผลิตภัณฑ์นี้มีซอฟต์แวร์ที่เขียนโดย Tim Hudson (tjh@cryptsoft.com)
2017/05/31 08:53:01 socat [16065] ฉันตั้งค่าตัวเลือก "symbolic-link" เป็น "/ tmp / lp1"
2017/05/31 08:53:01 socat [16065] ฉัน openpty ({5}, {6}, {"/ dev / pts / 1"} ,,) -> 0
2017/05/31 08:53:01 socat [16065] N PTY ​​คือ / dev / pts / 1
2017/05/31 08:53:01 socat [16065] ฉันตั้งค่าตัวเลือก "so-keepalive" ถึง 1
2017/05/31 08:53:01 socat [16065] ฉันตั้งค่าตัวเลือก "tcp-keepidle" ถึง 10
2017/05/31 08:53:01 socat [16065] ฉันตั้งค่าตัวเลือก "tcp-keepintvl" ถึง 10
2017/05/31 08:53:01 socat [16065] ฉันตั้งค่าตัวเลือก "tcp-keepcnt" ถึง 100
2017/05/31 08:53:01 socat [16065] ยังไม่มีการเปิดการเชื่อมต่อกับ AF = 2 192.168.0.5:9100
2017/05/31 08:53:01 socat [16065] ฉันเริ่มการเชื่อมต่อแบบวนซ้ำ
2017/05/31 08:53:01 socat [16065] ฉันซ็อกเก็ต (2, 1, 6) -> 7
2017/05/31 08:53:01 socat [16065] ไม่มีการเชื่อมต่อที่ประสบความสำเร็จจากที่อยู่ในท้องถิ่น AF = 2 192.168.0.4:56482
2017/05/31 08:53:01 socat [16065] ฉันแก้ไขและเปิดที่อยู่ถุงเท้าทั้งหมด
2017/05/31 08:53:01 socat [16065] ยังไม่มีการเริ่มการถ่ายโอนข้อมูลวนกับ FDs [5,5] และ [7,7]
2017/05/31 08:58:01 socat [16065] N socket 2 (fd 7) อยู่ที่ EOF
2017/05/31 08:58:02 socat [16065] ฉันโพลหมดเวลา (ไม่มีข้อมูลภายใน 0.500000 วินาที)
2017/05/31 08:58:02 socat [16065] ฉันปิด (5)
2017/05/31 08:58:02 socat [16065] ฉันปิด (7, 2)
2017/05/31 08:58:02 socat [16065] ยังไม่มีการออกจากสถานะ 0

เราเตอร์ NAT บางตัวตัดการเชื่อมต่อหลังจากเวลาที่กำหนดแทนที่จะเป็นกิจกรรม
Ferrybig

คำตอบ:


5

จากsocat manpageสำหรับ-t<timeout>:

เมื่อแชนเนลหนึ่งถึง EOF ส่วนการเขียนของแชนเนลอื่นจะปิดตัวลง

ลองเพิ่มignoreeofตัวเลือก


0

หากคุณกำลังใช้คำสั่ง LISTEN เช่นOPENSSL-LISTEN, TCP-LISTENฯลฯforkตัวเลือกจะแยกการเชื่อมต่อกับกระบวนการลูกเพื่อให้ socat สามารถรับต่อไปได้

ตัวอย่าง:

socat - OPENSSL-LISTEN:443,method=TLS1.2,verify=0,cert=cert.pem,key=key.pem,fork

ขอบคุณที่: https://unix.stackexchange.com/a/283289/15954

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.