เพียงเพื่อให้แน่ใจว่าเราอยู่ในหน้าเดียวกัน (คำถามของคุณคลุมเครือด้วยวิธีนี้) การขอผูก TCP บนพอร์ต 0 หมายถึงคำขอให้สร้างหมายเลขพอร์ตที่ไม่ได้ใช้แบบไดนามิก กล่าวอีกนัยหนึ่งหมายเลขพอร์ตที่คุณรับฟังหลังจากคำขอนั้นไม่เป็นศูนย์ มีความคิดเห็นเกี่ยวกับสิ่งนี้ใน[linux kernel source]/net/ipv4/inet_connection_sock.c
เมื่อinet_csk_get_port()
:
/* Obtain a reference to a local port for the given sock,
* if snum is zero it means select any available local port.
*/
ซึ่งเป็นแบบแผนยูนิกซ์มาตรฐาน อาจมีระบบที่จะอนุญาตให้ใช้พอร์ต 0 ได้จริง แต่ก็ถือว่าเป็นการปฏิบัติที่ไม่ดี อย่างไรก็ตามพฤติกรรมนี้ไม่ได้ระบุอย่างเป็นทางการโดย POSIX, IANA หรือโปรโตคอล TCP อย่างไรก็ตาม 1 คุณอาจพบที่น่าสนใจนี้
นั่นเป็นเหตุผลที่คุณไม่สามารถทำการเชื่อมต่อ TCP กับพอร์ตศูนย์ได้อย่างสมเหตุสมผล สันนิษฐานว่าnc
มีความตระหนักในเรื่องนี้และแจ้งให้คุณทราบว่าคุณกำลังทำสิ่งที่ไม่สมเหตุสมผล หากคุณลองใช้วิธีนี้ในเนทีฟ
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
fprintf(stderr,"%s", strerror(errno));
}
คุณได้รับข้อผิดพลาดเดียวกันกับที่คุณพยายามเชื่อมต่อกับพอร์ตอื่นที่ไม่สามารถใช้งานได้: ECONNREFUSED
"การเชื่อมต่อถูกปฏิเสธ" ดังนั้นในการตอบกลับ:
ระบบนี้จัดการกับที่ใดบ้าง? ในสแต็ก TCP ของเคอร์เนลระบบปฏิบัติการ
อาจจะไม่; ไม่ต้องการการจัดการเป็นพิเศษ นั่นคือถ้าคุณสามารถค้นหาระบบที่อนุญาตให้เชื่อมโยงและฟังพอร์ต 0 คุณอาจเชื่อมต่อกับมันได้
1 แต่ IANA ไม่เรียกมันว่า "ลิขสิทธิ์" ( ดูที่นี่ ) ความหมายพอร์ตนี้ไม่ควรใช้ออนไลน์ สิ่งนี้ทำให้ไม่เป็นไรเกี่ยวกับอนุสัญญาการมอบหมายแบบไดนามิก (เนื่องจากไม่ได้ใช้จริง) การกำหนดว่าโดยเฉพาะเพื่อจุดประสงค์นั้นอาจอยู่นอกเหนือขอบเขตของ IANA ในสาระสำคัญระบบปฏิบัติการมีอิสระที่จะทำสิ่งที่พวกเขาต้องการกับมันรวมถึงไม่มีอะไร