Unix Socket - Cấu trúc
Các cấu trúc khác nhau được sử dụng trong Lập trình Socket Unix để lưu giữ thông tin về địa chỉ và cổng cũng như các thông tin khác. Hầu hết các hàm socket yêu cầu một con trỏ tới cấu trúc địa chỉ socket làm đối số. Các cấu trúc được định nghĩa trong chương này có liên quan đến Họ Giao thức Internet.
sockaddr
Cấu trúc đầu tiên là sockaddr chứa thông tin về socket -
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
Đây là cấu trúc địa chỉ socket chung, sẽ được chuyển trong hầu hết các lệnh gọi hàm socket. Bảng sau đây cung cấp mô tả về các trường thành viên:
Thuộc tính | Giá trị | Sự miêu tả |
---|---|---|
sa_family | AF_INET AF_UNIX AF_NS AF_IMPLINK |
Nó đại diện cho một họ địa chỉ. Trong hầu hết các ứng dụng dựa trên Internet, chúng tôi sử dụng AF_INET. |
sa_data | Địa chỉ giao thức cụ thể | Nội dung của 14 byte địa chỉ cụ thể của giao thức được diễn giải theo loại địa chỉ. Đối với họ Internet, chúng tôi sẽ sử dụng địa chỉ IP số cổng, được biểu thị bằng cấu trúc sockaddr_in được định nghĩa bên dưới. |
sockaddr trong
Cấu trúc thứ hai giúp bạn tham chiếu đến các phần tử của socket như sau:
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
Đây là mô tả của các trường thành viên -
Thuộc tính | Giá trị | Sự miêu tả |
---|---|---|
sa_family | AF_INET AF_UNIX AF_NS AF_IMPLINK |
Nó đại diện cho một họ địa chỉ. Trong hầu hết các ứng dụng dựa trên Internet, chúng tôi sử dụng AF_INET. |
sin_port | Cổng dịch vụ | Số cổng 16 bit trong Thứ tự byte mạng. |
sin_addr | Địa chỉ IP | Một địa chỉ IP 32 bit trong Thứ tự Byte Mạng. |
sin_zero | Không được sử dụng | Bạn chỉ cần đặt giá trị này thành NULL vì nó không được sử dụng. |
trong addr
Cấu trúc này chỉ được sử dụng trong cấu trúc trên như một trường cấu trúc và chứa netid / hostid 32 bit.
struct in_addr {
unsigned long s_addr;
};
Đây là mô tả của các trường thành viên -
Thuộc tính | Giá trị | Sự miêu tả |
---|---|---|
s_addr | cổng dịch vụ | Một địa chỉ IP 32 bit trong Thứ tự Byte Mạng. |
chủ nhà
Cấu trúc này được sử dụng để giữ thông tin liên quan đến máy chủ.
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list
#define h_addr h_addr_list[0]
};
Đây là mô tả của các trường thành viên -
Thuộc tính | Giá trị | Sự miêu tả |
---|---|---|
h_name | ti.com v.v. | Đây là tên chính thức của máy chủ. Ví dụ: tutorialspoint.com, google.com, v.v. |
h_aliases | TI | Nó chứa một danh sách các bí danh tên máy chủ. |
h_addrtype | AF_INET | Nó chứa họ địa chỉ và trong trường hợp ứng dụng dựa trên Internet, nó sẽ luôn là AF_INET. |
h_length | 4 | Nó chứa độ dài của địa chỉ IP, là 4 cho Địa chỉ Internet. |
h_addr_list | in_addr | Đối với địa chỉ Internet, mảng con trỏ h_addr_list [0], h_addr_list [1], v.v., là các điểm đến cấu trúc in_addr. |
NOTE - h_addr được định nghĩa là h_addr_list [0] để giữ khả năng tương thích ngược.
servent
Cấu trúc cụ thể này được sử dụng để giữ thông tin liên quan đến dịch vụ và các cổng liên quan.
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
Đây là mô tả của các trường thành viên -
Thuộc tính | Giá trị | Sự miêu tả |
---|---|---|
tên của | http | Đây là tên chính thức của dịch vụ. Ví dụ: SMTP, FTP POP3, v.v. |
s_aliases | ALIAS | Nó chứa danh sách các bí danh dịch vụ. Hầu hết thời gian điều này sẽ được đặt thành NULL. |
s_port | 80 | Nó sẽ có số cổng liên quan. Ví dụ: đối với HTTP, giá trị này sẽ là 80. |
s_proto | TCP UDP |
Nó được đặt thành giao thức được sử dụng. Dịch vụ Internet được cung cấp bằng TCP hoặc UDP. |
Mẹo về cấu trúc ổ cắm
Cấu trúc địa chỉ socket là một phần không thể thiếu của mọi chương trình mạng. Chúng tôi phân bổ chúng, điền vào và chuyển các con trỏ tới chúng đến các hàm socket khác nhau. Đôi khi chúng ta chuyển một con trỏ đến một trong những cấu trúc này tới một hàm socket và nó sẽ điền vào nội dung.
Chúng tôi luôn chuyển các cấu trúc này bằng tham chiếu (tức là chúng tôi truyền một con trỏ đến cấu trúc, không phải chính cấu trúc) và chúng tôi luôn chuyển kích thước của cấu trúc như một đối số khác.
Khi một hàm socket điền vào một cấu trúc, độ dài cũng được chuyển bằng tham chiếu, do đó giá trị của nó có thể được cập nhật bởi hàm. Chúng tôi gọi đây là các đối số giá trị-kết quả.
Luôn luôn đặt các biến cấu trúc thành NULL (tức là '\ 0') bằng cách sử dụng memset () cho các hàm bzero (), nếu không, nó có thể nhận được các giá trị rác không mong muốn trong cấu trúc của bạn.