2010-03-03 30 views
9

Tôi cần gửi một số dữ liệu đến máy chủ từ xa qua UDP trong một cổng cụ thể và nhận được phản hồi từ cổng đó. Tuy nhiên, nó đang chặn và tôi không nhận được bất kỳ phản ứng nào. Tôi cần phải kiểm tra xem giá trị addrinfo mà tôi nhận được từ getaddrinfo(SERVER_NAME, port, &hints, &servinfo) có đúng hay không.Cách lấy số cổng từ addrinfo trong unix c

Làm cách nào để nhận số cổng từ cấu trúc dữ liệu này?

Tôi biết inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),s, sizeof s) cung cấp cho tôi địa chỉ IP máy chủ. (Tôi đang sử dụng các phương pháp trong hướng dẫn Beej của.)

Trả lời

24

Bạn làm điều gì đó tương tự như những gì chức năng get_in_addr Beej của không:

// 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); 
} 

Cũng hãy cẩn thận của # 1 cạm bẫy đối phó với số cảng ở sockaddr_in (hoặc scokaddr_in6) cấu trúc: số cổng luôn được lưu trữ trong thứ tự byte mạng.

Điều đó có nghĩa, ví dụ, rằng nếu bạn in ra kết quả của "get_in_port" gọi trên, bạn cần phải ném vào một "ntohs()":

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

này dường như làm việc ... tôi thấy rằng cổng là chính xác, tuy nhiên tôi nhận được một "Lỗi nhận được trong UDP: Kết nối từ chối" khi tôi cố gắng để có được một phản ứng từ máy chủ. tại sao một vấn đề như vậy lại nảy sinh? tôi đã thử kết nối UDP – sfactor

+0

"Kết nối bị từ chối" thường có nghĩa là không có quá trình nghe trên cổng đích mà bạn chỉ định. Nó cũng có thể chỉ ra rằng có một bức tường lửa ngăn cản bạn gửi đến máy chủ/cổng đó. –

+0

Không quan trọng lắm, nhưng người ta có thể khẳng định (sa-> sa_family == AF_INET6) 'đối với trường hợp khác, vì cũng có' AF_IRDA', 'AF_BTH' (Bluetooth),' AF_IPX', 'AF_APPLETALK',' AF_NETBIOS' và có thể các gia đình giao thức khác chưa được phát minh. –

Các vấn đề liên quan