2012-03-22 19 views
6

trong "sys/socket.h" nó định nghĩa các chức năng:Chiều dài kích thước địa chỉ của hàm chấp nhận trong <sys/socket.h>

int accept (int socket, struct sockaddr *address, socklen_t *address_len); 

Câu hỏi của tôi đã làm với socklen_t * address_len dựa trên số manual trỏ đến một số socklen_t mà trên đầu vào chỉ định độ dài của cấu trúc sockaddr được cung cấp và trên đầu ra chỉ định độ dài của địa chỉ được lưu trữ.

Trong điều kiện nào thì đầu vào kích thước address_len khác với đầu ra?

Tôi cần điều này để tôi có thể mô phỏng trường hợp thử nghiệm trên trình bao bọc mà tôi đã tạo cho cấu trúc sockaddr_in.

Cảm ơn rất nhiều!

+0

+1 câu hỏi hay –

+0

'sockaddr' có mảng' char' làm thành viên thứ hai. Giá trị trả về trong 'address_len' sẽ được bao nhiêu phần tử thực sự được sử dụng trong thành viên đó (trái ngược với bao nhiêu phần tử có thể chứa) – Attila

Trả lời

4

Không bao giờ có thể nhiều hơn (độ dài đầu vào là giới hạn để ngăn chặn tràn), nhưng nó có thể ít hơn đối với một số loại socket nhất định, ví dụ: unix domain sockets có địa chỉ cơ bản là tên đường dẫn. Đối với ổ cắm IP (v4 hoặc v6), nó sẽ luôn là kích thước danh nghĩa của cấu trúc sockaddr_in hoặc tương ứng.

Cũng lưu ý rằng có thể sử dụng một số giao diện như thế này mà không biết loại địa chỉ/giao thức gia đình nào có liên quan. Ví dụ, bạn có thể có một chức năng như là một phần của mã thư viện của bạn mà có một ổ cắm của loại không rõ và các cuộc gọi chấp nhận trên nó với một cấu trúc sockaddr_storage. Nó có thể tìm thấy một địa chỉ IPv4, và địa chỉ IPv6, hoặc một cái gì đó khác hoàn toàn, tùy thuộc vào những gì người gọi đã làm.

Cách sử dụng này khá không điển hình cho accept, nhưng có nhiều khả năng là getpeername sử dụng cùng một kiểu giao diện. Trong thực tế, đây là cách tất cả các daemon chạy từ inetd và muốn biết địa chỉ từ xa phải hoạt động.

+0

Cảm ơn bạn rất nhiều! –

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