Unix Socket - โครงสร้าง
โครงสร้างต่างๆถูกใช้ใน Unix Socket Programming เพื่อเก็บข้อมูลเกี่ยวกับที่อยู่และพอร์ตและข้อมูลอื่น ๆ ฟังก์ชันซ็อกเก็ตส่วนใหญ่ต้องการตัวชี้ไปยังโครงสร้างที่อยู่ของซ็อกเก็ตเป็นอาร์กิวเมนต์ โครงสร้างที่กำหนดในบทนี้เกี่ยวข้องกับ Internet Protocol Family
ถุงเท้า
โครงสร้างแรกคือsockaddrที่เก็บข้อมูลซ็อกเก็ต -
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
นี่คือโครงสร้างที่อยู่ซ็อกเก็ตทั่วไปซึ่งจะถูกส่งผ่านในการเรียกฟังก์ชันซ็อกเก็ตส่วนใหญ่ ตารางต่อไปนี้ให้คำอธิบายของฟิลด์สมาชิก -
แอตทริบิวต์ | ค่า | คำอธิบาย |
---|---|---|
sa_family | AF_INET AF_UNIX AF_NS AF_IMPLINK |
แสดงถึงครอบครัวที่อยู่ ในแอปพลิเคชันบนอินเทอร์เน็ตส่วนใหญ่เราใช้ AF_INET |
sa_data | ที่อยู่เฉพาะโปรโตคอล | เนื้อหาของที่อยู่เฉพาะโปรโตคอล 14 ไบต์ถูกตีความตามประเภทของที่อยู่ สำหรับตระกูลอินเทอร์เน็ตเราจะใช้หมายเลขพอร์ตที่อยู่ IP ซึ่งแสดงโดยโครงสร้างsockaddr_in ที่กำหนดไว้ด้านล่าง |
sockaddr ใน
โครงสร้างที่สองที่ช่วยให้คุณอ้างอิงถึงองค์ประกอบของซ็อกเก็ตมีดังนี้ -
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
นี่คือคำอธิบายของช่องสมาชิก -
แอตทริบิวต์ | ค่า | คำอธิบาย |
---|---|---|
sa_family | AF_INET AF_UNIX AF_NS AF_IMPLINK |
แสดงถึงครอบครัวที่อยู่ ในแอปพลิเคชันบนอินเทอร์เน็ตส่วนใหญ่เราใช้ AF_INET |
sin_port | พอร์ตบริการ | หมายเลขพอร์ต 16 บิตในลำดับไบต์เครือข่าย |
sin_addr | ที่อยู่ IP | ที่อยู่ IP 32 บิตในลำดับไบต์เครือข่าย |
sin_zero | ไม่ได้ใช้ | คุณเพียงแค่ตั้งค่านี้เป็น NULL เนื่องจากไม่ได้ใช้ |
ใน addr
โครงสร้างนี้ใช้เฉพาะในโครงสร้างด้านบนเป็นฟิลด์โครงสร้างและมี 32 บิต netid / hostid
struct in_addr {
unsigned long s_addr;
};
นี่คือคำอธิบายของช่องสมาชิก -
แอตทริบิวต์ | ค่า | คำอธิบาย |
---|---|---|
s_addr | พอร์ตบริการ | ที่อยู่ IP 32 บิตในลำดับไบต์เครือข่าย |
โฮสต์
โครงสร้างนี้ใช้เพื่อเก็บข้อมูลที่เกี่ยวข้องกับโฮสต์
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]
};
นี่คือคำอธิบายของช่องสมาชิก -
แอตทริบิวต์ | ค่า | คำอธิบาย |
---|---|---|
h_name | ti.com เป็นต้น | เป็นชื่อทางการของโฮสต์ ตัวอย่างเช่น tutorialspoint.com, google.com เป็นต้น |
h_aliases | Ti | มีรายการนามแฝงชื่อโฮสต์ |
h_addrtype | AF_INET | ประกอบด้วยตระกูลที่อยู่และในกรณีของแอปพลิเคชันบนอินเทอร์เน็ตจะเป็น AF_INET เสมอ |
h_length | 4 | ถือความยาวของที่อยู่ IP ซึ่งเป็น 4 สำหรับที่อยู่อินเทอร์เน็ต |
h_addr_list | in_addr | สำหรับที่อยู่อินเทอร์เน็ตอาร์เรย์ของพอยน์เตอร์ h_addr_list [0], h_addr_list [1] และอื่น ๆ เป็นจุดในโครงสร้าง in_addr |
NOTE - h_addr ถูกกำหนดให้เป็น h_addr_list [0] เพื่อรักษาความเข้ากันได้แบบย้อนหลัง
เซอเวนต์
โครงสร้างเฉพาะนี้ใช้เพื่อเก็บข้อมูลที่เกี่ยวข้องกับบริการและพอร์ตที่เกี่ยวข้อง
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
นี่คือคำอธิบายของช่องสมาชิก -
แอตทริบิวต์ | ค่า | คำอธิบาย |
---|---|---|
s_name | http | นี่คือชื่ออย่างเป็นทางการของบริการ ตัวอย่างเช่น SMTP, FTP POP3 เป็นต้น |
s_aliases | ALIAS | มันมีรายการนามแฝงบริการ เวลาส่วนใหญ่จะถูกตั้งค่าเป็น NULL |
กีฬา | 80 | จะมีหมายเลขพอร์ตที่เกี่ยวข้อง ตัวอย่างเช่นสำหรับ HTTP จะเป็น 80 |
s_proto | TCP UDP |
ตั้งค่าเป็นโปรโตคอลที่ใช้ บริการอินเทอร์เน็ตมีให้โดยใช้ TCP หรือ UDP |
เคล็ดลับเกี่ยวกับโครงสร้างซ็อกเก็ต
โครงสร้างที่อยู่ของซ็อกเก็ตเป็นส่วนสำคัญของทุกโปรแกรมเครือข่าย เราจัดสรรพวกเขาเติมเต็มและส่งผ่านตัวชี้ไปยังฟังก์ชันซ็อกเก็ตต่างๆ บางครั้งเราส่งตัวชี้ไปยังโครงสร้างเหล่านี้ไปยังฟังก์ชันซ็อกเก็ตและเติมลงในเนื้อหา
เราส่งผ่านโครงสร้างเหล่านี้โดยการอ้างอิงเสมอ (กล่าวคือเราส่งตัวชี้ไปที่โครงสร้างไม่ใช่โครงสร้างเอง) และเราส่งผ่านขนาดของโครงสร้างเป็นอาร์กิวเมนต์อื่นเสมอ
เมื่อฟังก์ชันซ็อกเก็ตเติมในโครงสร้างความยาวจะถูกส่งผ่านโดยการอ้างอิงด้วยเพื่อให้ฟังก์ชันสามารถอัปเดตค่าได้ เราเรียกสิ่งเหล่านี้ว่าอาร์กิวเมนต์มูลค่า - ผลลัพธ์
ตั้งค่าตัวแปรโครงสร้างเป็น NULL (เช่น '\ 0') เสมอโดยใช้ memset () สำหรับฟังก์ชัน bzero () มิฉะนั้นอาจได้รับค่าขยะที่ไม่คาดคิดในโครงสร้างของคุณ