Unix c

2010-03-03 17 views
9

'daki addrinfo port numarası nasıl alınır? Belirli bir portta UDP aracılığıyla uzaktaki bir sunucuya bazı veriler göndermem ve ondan bir yanıt almam gerekiyor. Ancak, engelleme ve hiçbir yanıt alamıyorum. getaddrinfo(SERVER_NAME, port, &hints, &servinfo)'dan aldığım addrinfo değerinin doğru olup olmadığını kontrol etmem gerekiyor.Unix c

Bağlantı noktası numarasını bu veri yapısından nasıl alırım?

Biliyorum inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),s, sizeof s) bana sunucu IP adresi veriyor. (Ben Beej kılavuzunda yöntemini kullanıyorum.)

cevap

24

Sen Beej en get_in_addr işlevi ne benzer bir şey yapmak:

// get port, IPv4 or IPv6: 
in_port_t get_in_port(struct sockaddr *sa) 
{ 
    if (sa->sa_family == AF_INET) { 
     return (((struct sockaddr_in*)sa)->sin_port); 
    } 

    return (((struct sockaddr_in6*)sa)->sin6_port); 
} 

Ayrıca sockaddr_in içinde noktası numaraları ile uğraşan 1. çukurdan sakının (veya scokaddr_in6) yapılar: bağlantı noktası numaraları her zaman ağ bayt sırası'da depolanır.

demektir Yani, örneğin, "get_in_port" sonucunu çıktısını eğer yukarıda dediğimiz, siz ") ntohs (" a atmak gerekir:

printf("port is %d\n",ntohs(get_in_port((struct sockaddr *)p->ai_addr))); 
+0

bu iş gibi görünüyor ... Bağlantı noktasının doğru olduğunu görüyorum, ancak sunucudan yanıt almaya çalıştığımda "UDP'de hata alıyor: Bağlantı reddedildi". Böyle bir sorun neden ortaya çıkıyor? UDP'yi bağlamayı denedim – sfactor

+0

"Bağlantı reddedildi", tipik olarak, belirttiğiniz hedef bağlantı noktasında dinleme işlemi olmadığı anlamına gelir. Ayrıca, o sunucuya/bağlantı noktasına göndermenizi engelleyen bir güvenlik duvarı olduğunu da gösterebilir. –

+0

Çok fazla önemli değil, ama aynı zamanda “AF_IRDA”, “AF_BTH” (Bluetooth), “AF_IPX”, “AF_APPLETALK”, “olduğu gibi” (= sa_family == AF_INET6) AF_NETBIOS' ve belki diğer protokol aileleri henüz icat değil. –