เกี่ยวกับสาเหตุที่ nwildner เขียนคำตอบที่ยอดเยี่ยมแล้ว
ที่นี่ฉันจะมุ่งเน้นไปที่วิธีและการใช้เส้นทางสัมพัทธ์
ภายในขณะที่ไฟล์ซ็อกเก็ตยังสามารถค้นหาตามชื่อ (ฉันเดา) พวกเขามักจะค้นหาโดยไอโหนด ในลินุกซ์, การค้นหานี้คือมั่นใจโดยฟังก์ชั่นunix_find_socket_byinode()
ที่กำหนดไว้ในสุทธิ / Unix / af_unix.c
สามารถตรวจสอบได้ง่ายดังนี้
- สร้างสองไดเรกทอรีA /และB /
- ภายใต้แต่ละไดเรกทอรีให้กระบวนการฟังไฟล์ซ็อกเก็ตที่มีชื่อเดียวกัน ด้วย
socat
คุณจะใช้คำสั่งเช่น:
$ socat UNIX-LISTEN:./my.sock -
- ตอนนี้แลกเปลี่ยนไฟล์ซ็อกเก็ตโดยการย้ายA / my.sockเป็นB /และในทางกลับกัน
- จากนี้ไปหากแอปพลิเคชันไคลเอนต์เชื่อมต่อกับA / my.sockมันจะติดต่อกับเซิร์ฟเวอร์Bและถ้ามันเชื่อมต่อกับB / my.sockมันจะติดต่อกับเซิร์ฟเวอร์A (โปรดทราบว่าเมื่อการสื่อสารสิ้นสุดลงกระบวนการเซิร์ฟเวอร์อาจ ลบสิ่งที่คิดว่าเป็นไฟล์ซ็อกเก็ตของตัวเอง)
ฉันตรวจสอบพฤติกรรมนี้ในระบบ Unix จำนวนหนึ่ง (Linux Debian, FreeBSD และ OpenIndiana เพื่อให้ได้ความหลากหลาย) ดังนั้นพฤติกรรมนี้ดูเหมือนจะแพร่กระจายอย่างน้อยถ้าไม่ใช่มาตรฐาน
เส้นทางแบบสัมบูรณ์มักใช้เป็นแบบแผนระหว่างไคลเอ็นต์และกระบวนการเซิร์ฟเวอร์เนื่องจากกระบวนการไคลเอ็นต์อาจไม่ทราบวิธีสร้างการสื่อสารเริ่มต้นกับเซิร์ฟเวอร์
อย่างไรก็ตามหากการสื่อสารเริ่มต้นนี้ไม่เป็นปัญหาดูเหมือนว่าปลอดภัยที่จะใช้พา ธ สัมพัทธ์สำหรับการสร้างไฟล์ซ็อกเก็ตช่วยให้หลีกเลี่ยงปัญหาความยาวพา ธ เมื่อตำแหน่งไฟล์ซ็อกเก็ตไม่ได้ถูกควบคุมโดยตรงโดยกระบวนการเซิร์ฟเวอร์