2011-09-07 43 views
7

Tôi có một sockaddr_storage chứa địa chỉ ipv4 và cổng của máy chủ từ xa. Tôi đã không nhìn thấy những struct s trước khi mặc dù và tôi không chắc chắn làm thế nào để đúc nó vào một struct nơi tôi có thể trực tiếp lấy địa chỉ IP và số cổng. Tôi đã thử googling các struct nhưng đã không tìm thấy bất cứ điều gì. Có bất cứ đề nghị nào cho việc làm như thế này hả?truy xuất ip và cổng từ sockaddr_storage

Cảm ơn

+0

Bạn có chắc đó là cấu trúc 'sockaddr_storage' chứ không phải cấu trúc' sockaddr'? –

+0

Vâng, đó là cấu trúc sockaddr_storage. – KaiserJohaan

+1

@Tony: 'sockaddr_storage' là cấu trúc ưu tiên để sử dụng trong mã mới hơn, vì nó hỗ trợ nhiều gia đình địa chỉ, bao gồm IPv4 và IPv6. –

Trả lời

5

Bạn có thể đúc các con trỏ đến struct sockaddr_in * hoặc struct sockaddr_in6 * và truy cập các thành viên trực tiếp, nhưng đó là sẽ mở một lon sâu về răng cưa vi phạm và các vấn đề miscompilation.

Cách tiếp cận tốt hơn là chuyển con trỏ đến getnameinfo với các cờ NI_NUMERICHOSTNI_NUMERICSERV để có được trình bày chuỗi địa chỉ và cổng. Điều này có lợi thế là nó hỗ trợ cả IPv4 và IPv6 không có mã bổ sung, và trong lý thuyết hỗ trợ tất cả các loại địa chỉ trong tương lai. Bạn có thể phải đưa con trỏ đến void * (hoặc struct sockaddr * một cách rõ ràng, nếu bạn đang sử dụng C++) để chuyển nó đến getnameinfo, nhưng điều này không gây ra sự cố.

+0

Tôi chỉ sử dụng thư viện chuẩn C; giải nén cổng từ một chuỗi âm thanh đau đớn. Nếu tôi biết trước là nó sẽ là Ipv4 hay Ipv6, thì không có vấn đề gì khi đưa nó vào cấu trúc sockaddr_in/sockaddr_in6? – KaiserJohaan

+0

Tôi không thấy làm thế nào 'atoi' là khó khăn ... –

2

Để mở rộng một câu trả lời trên và cung cấp một mã có sử dụng getnameinfo chức năng, kiểm tra đoạn này:

struct sockaddr_storage client_addr; 
socklen_t client_len = sizeof(struct sockaddr_storage); 

// Accept client request 
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len); 

char hoststr[NI_MAXHOST]; 
char portstr[NI_MAXSERV]; 

int rc = getnameinfo((struct sockaddr *)&client_addr, client_len, hoststr, sizeof(hoststr), portstr, sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV); 
if (rc == 0) printf("New connection from %s %s", hoststr, portstr); 

Kết quả là một hoststr chứa một địa chỉ IP từ struct sockaddr_storageportstr chứa một cổng tương ứng.

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