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.