2010-10-28 33 views
29

Tôi đang gặp khó khăn để tìm ra này - Tôi đang làm việc với ổ cắm trong C sử dụng hướng dẫn này - http://binarii.com/files/papers/c_sockets.txtSockets - Làm thế nào để tìm ra những cổng và địa chỉ Tôi đang giao

Tôi đang cố gắng để tự động nhận được ip và cổng của tôi bằng cách sử dụng:

server.sin_port = 0;    /* bind() will choose a random port*/ 
server.sin_addr.s_addr = INADDR_ANY; /* puts server's IP automatically */ 
... 
... 
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function 

Sau khi liên kết thành công, làm cách nào để tìm hiểu IP và Cổng nào tôi thực sự được gán?

+0

Thực ra điều gì đang xảy ra khi bạn chỉ định 'INADDR_ANY' không phải là nó tự động đặt IP của máy chủ, những gì nó làm là tìm tất cả các giao diện và liên kết với từng giao diện. Do đó, bạn có nhiều câu trả lời đúng cho câu hỏi của bạn. – jer

+0

Hmm - cảm ơn jer. Bài tập mà tôi đang thực hiện yêu cầu tôi tự động lấy IP và cổng bằng mã được chỉ định, nhưng tôi sẽ in địa chỉ máy chủ và cổng cho máy khách để kết nối trên màn hình. Đây là những gì tôi đang cố gắng tìm ra cách để làm. Nếu tôi sử dụng cấu trúc sockaddr, tôi chỉ nhận được 0.0.0.0 và cổng 0. – stringo0

+1

Xem http://stackoverflow.com/questions/2496302/how-can-i-obtain-the-local-tcp-port-and-ip -address-of-my-client-program – mark4o

Trả lời

60

Nếu đó là một ổ cắm máy chủ, bạn nên gọi listen() vào ổ cắm của bạn, và sau đó getsockname() để tìm số cổng mà nó đang lắng nghe:

struct sockaddr_in sin; 
socklen_t len = sizeof(sin); 
if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1) 
    perror("getsockname"); 
else 
    printf("port number %d\n", ntohs(sin.sin_port)); 

Đối với các địa chỉ IP, nếu bạn sử dụng INADDR_ANY sau đó socket máy chủ có thể chấp nhận các kết nối đến bất kỳ địa chỉ IP của máy nào và chính socket máy chủ không có địa chỉ IP cụ thể. Ví dụ: nếu máy của bạn có hai địa chỉ IP thì bạn có thể nhận được hai kết nối đến trên socket máy chủ này, mỗi địa chỉ có địa chỉ IP cục bộ khác nhau. Bạn có thể sử dụng getsockname() trên ổ cắm cho một kết nối cụ thể (mà bạn nhận được từ accept()) để tìm hiểu địa chỉ IP cục bộ nào đang được sử dụng trên kết nối đó.

+0

Cảm ơn mark4o - Điều đó hoạt động tuyệt vời! Nhưng tôi vẫn gặp khó khăn khi nhận địa chỉ - tôi vẫn nhận được 0.0.0.0 - bất kỳ ý tưởng nào? Cảm ơn! – stringo0

+1

Ổ cắm máy chủ không có địa chỉ IP cụ thể và máy có thể có nhiều địa chỉ IP. Nếu bạn chỉ muốn nhận được một trong các địa chỉ của máy, hãy xem câu hỏi khác này: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer – mark4o

+1

Cảm ơn - gethostname đã làm các trick :) – stringo0

4

Nhận xét trong mã của bạn sai. INADDR_ANY không tự động đặt IP của máy chủ '. Về bản chất, nó đặt 0.0.0.0, vì những lý do được giải thích trong số answer của mark4o.

+0

Làm cho rất nhiều ý nghĩa bây giờ. Cảm ơn! – stringo0

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