Page 241 - Computer Network
P. 241
232 บทที่ 29. APPLICATION LAYER
29.1 ซ็อกเก็ต (Socket)
การพัฒนาของระบบ UNIX เพื่อรองรับการใช้งานร่วมกันแบบแบ่งเวลา (time sharing) ทำให้เกิดการทำงานของ
ระบบปฏิบัติการในลักษณะที่เป็นโปรเซส (process) โดยที่แต่ละแอพพลิเคชันของผู้ใช้มีการทำงานเสมือนเป็น
โปรเซส โดยที่แต่ละแอพพลิเคชันติดต่อกับระบบปฏิบัติการในลักษณะที่เรียกว่า system call หรือการเรียกใช้
งานระบบ การเรียกใช้เพื่อการสื่อสารกับเน็ตเวิร์คจะอยู่ในลักษณะเดียวกัน แต่อยู่ในรูปแบบที่เรียกว่า ซ็อกเก็ต
(Socket) เสมือนเป็นไฟล์เพื่อใช้ในการเข้าถึงการเชื่อมต่อเน็ตเวิร์ค
29.1.1 การสร้างการเชื่อมต่อโดยซ็อกเก็ต
การที่แอพพลิเคชันจะร้องขอไปยังระบบปฏิบัติการเพื่อสร้างซ็อกเก็ตที่ต้องการ ผู้ใช้จำเป็นจะต้องระบุตัวแปร 3 ตัว
ได้แก่
• Protocolfamilyเพื่อใช้ระบุตระกูลของโพรโตคอลที่ใช้ทำให้ทราบรูปแบบของแอดเดรสที่ใช้เช่นAF_INET
เพื่อระบุ IPv4 book)
• Type of socket ระบุประเภทของซ็อกเก็ตการสื่อสารที่ใช้ เช่น SOCK_STREAM ใช้เพื่อการใช้งานแบบ
connnection-oriented หรือ SOCK_DGRAM เพื่อใช้งานแบบ datagram
• Protocol type ชนิดของโพรโตคอลที่ต้องสอดคล้องกับประเภทของซ็อกเก็ต เช่น SOCK_STREAM ต้อง
ใช้งานกับ IPPROTO_TCP (partial
การสร้างซ็อกเก็ตสามารถทำได้โดยคำสั่ง socket โดยการเรียกใช้คำสั่งดังกล่าว ระบบจะคืนค่าของจำนวนเต็มบวก
only
รูปแบบการเรียกใช้จะเป็น
result = socket(protocol family, type of socket, protocol type)
KKU
ตัวอย่างการการเรียกใช้ซ็อกเก็ตแสดงในตัวอย่างโค้ดที่ 29.1
ตัวอย่างโค้ด 29.1: การสร้างซ็อกเก็ตแบบ Connection-oriented
int result;
result = socket(AF_INET, SOCK_STREAM, PPRPOTO_TCP}
if(result < 0)
{
perror("SOCKET ERROR");
exit (1);
}
close(result);
จากตัวอย่างโค้ดที่ 29.1 เป็นการสร้างซ็อกเก็ตที่เป็นแบบ Connection-oriented เราสามารถสรุปขั้นตอนการ
สร้างได้ดังรูปที่ 29.2 จากรูปจะเห็นว่าการสร้างแบ่งเป็นสองฝั่งคือฝั่งของเซิร์ฟเวอร์และฝั่งของไคลเอนต์ โดยที่ในฝั่ง
ของเซิร์ฟเวอร์จะรอการร้องขอการเชื่อมต่อจากไคลเอนต์ ฟังก์ชันที่จำเป็นในฝั่งเซิร์ฟเวอร์ได้แก่
bind แม้ว่าจะมีการสร้างซ็อกเก็ตเรียบร้อย แต่ยังไม่ได้มีการกำหนดพอร์ตแอดเดรสและ IP address เพื่อการ
สื่อสาร ดังนั้นหลังจากการสร้างซ็อกเก็ต เซิร์ฟเวอร์ใช้คำสั่ง bind เพื่อกำหนดแอดเดรสตนเองและรอการ
ร้องขอจากไคลเอนต์ต่อไป โดยที่รูปแบบของคำสั่ง bind เป็น
bind(socket, local address, address length)

