Sadece aynı sayfada olduğumuzdan emin olmak için (sorunuz bu şekilde belirsizdir), TCP'yi 0 numaralı bağlantı noktasından bağlamak istemeniz, dinamik olarak kullanılmayan bir bağlantı noktası numarası oluşturma isteğini belirtir. Başka bir deyişle, bu istekden sonra gerçekten dinlediğiniz port numarası sıfır değildir. Bu açmayla ilgili bir açıklama var [linux kernel source]/net/ipv4/inet_connection_sock.c
üzerinde 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.
*/
Bu standart bir unix konvansiyonudur. Bağlantı noktası 0'ın kullanımına gerçekten izin verecek sistemler olabilir, ancak bunun kötü bir uygulama olduğu düşünülür. Ancak bu davranış resmi olarak POSIX, IANA veya TCP protokolü tarafından belirtilmemiştir. 1 Bunu ilginç bulabilirsiniz .
Bu nedenle, sıfır numaralı bağlantı noktasına kesin bir TCP bağlantısı kuramazsınız. Muhtemelen nc
bunun farkında ve duyusal olmayan bir talepte bulunduğunuzu bildirir. Bunu yerel kodda denerseniz:
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));
}
Kullanılamayan diğer bağlantı noktalarına bağlanmaya çalıştığınız aynı hatayı alıyorsunuz: ECONNREFUSED
"Bağlantı reddedildi". Yani cevap olarak:
Bu sistem neresinde kullanılır? İşletim sistemi çekirdeğinin TCP yığınında mı?
Muhtemelen değil; özel işlem gerektirmez. Yani, 0 numaralı bağlantı noktasında bağlanma ve dinlemeye izin veren bir sistem bulabilirseniz, muhtemelen buna bağlanabilirsiniz.
1. Ama IANA yok "Saklıdır" (olarak bakın burada bakınız ). Anlamı, bu liman olmamalı çevrimiçi kullanılabilir. Bu, dinamik atama kongre (tamamiyle kullanılmayacağından) açısından tamamdır. Bunun özellikle bir amaç olarak IANA'nın kapsamının ötesinde olacağını; Aslında, işletim sistemleri, hiçbir şey dahil, istediklerini yapmakta serbesttirler.