ภาพรวมซ็อกเก็ต
พื้นฐานการสื่อสารเครือข่าย
ภาพรวมซ็อกเก็ต เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
ซ็อกเก็ตคืออะไร
ซ็อกเก็ต คือปลายทางสำหรับการสื่อสารผ่านเครือข่าย ในระบบ POSIX ซ็อกเก็ตคือไฟล์เดสคริปเตอร์ที่คุณสามารถอ่านและเขียนได้ ทำให้โปรแกรมสองโปรแกรมแลกเปลี่ยนข้อมูลผ่านเครือข่ายหรือภายในเครื่องเดียวกันได้
รูปแบบไคลเอนต์-เซิร์ฟเวอร์
แอปเครือข่ายส่วนใหญ่ใช้รูปแบบไคลเอนต์-เซิร์ฟเวอร์:
- เซิร์ฟเวอร์ ผูกกับที่อยู่และรอการเชื่อมต่อ
- ไคลเอนต์ เป็นฝ่ายเริ่มการเชื่อมต่อไปยังเซิร์ฟเวอร์
เมื่อเชื่อมต่อแล้ว ทั้งสองฝั่งสามารถส่งและรับข้อมูลได้
TCP เทียบกับ UDP
โพรโทคอลขนส่งหลักสองแบบ:
- TCP (SOCK_STREAM): เชื่อถือได้ มีลำดับ และอาศัยการเชื่อมต่อ
- UDP (SOCK_DGRAM): รวดเร็ว ไม่ต้องเชื่อมต่อ และแพ็กเก็ตอาจสูญหายหรือมาถึงไม่ตามลำดับ
ใช้ TCP เมื่อต้องการความถูกต้อง และใช้ UDP เมื่อต้องการการสตรีมที่มีความหน่วงต่ำ
การสร้างซ็อกเก็ต
การเรียก socket() จะคืนค่าไฟล์เดสคริปเตอร์ อาร์กิวเมนต์ได้แก่ ตระกูลที่อยู่ (AF_INET สำหรับ IPv4) ชนิด (SOCK_STREAM สำหรับ TCP) และโพรโทคอล (0 สำหรับค่าเริ่มต้น)
/* Conceptual: sockets need a network environment to run */
#include <sys/socket.h>
#include <netinet/in.h>
int create_tcp_socket(void) {
int fd = socket(AF_INET, SOCK_STREAM, 0);
/* fd < 0 means error; check with perror */
return fd;
}โครงสร้างที่อยู่ซ็อกเก็ต
ที่อยู่ IPv4 อธิบายด้วย struct sockaddr_in ซึ่งเก็บตระกูล พอร์ต และที่อยู่ IP ฟังก์ชันต่าง ๆ รับค่า struct sockaddr * ซึ่งเป็นชนิดทั่วไป ดังนั้นคุณจึงต้องแปลงชนิด
#include <netinet/in.h>
void fill_addr(struct sockaddr_in *addr, unsigned short port) {
addr->sin_family = AF_INET;
addr->sin_port = htons(port); /* host to network short */
addr->sin_addr.s_addr = INADDR_ANY; /* all interfaces */
}ลำดับไบต์มีความสำคัญ
เครือข่ายใช้รูปแบบบิ๊กเอนเดียน (ลำดับไบต์ของเครือข่าย) ให้แปลงด้วย:
htons/htonlแปลงจากโฮสต์เป็นเครือข่าย (แบบสั้น/ยาว)ntohs/ntohlแปลงจากเครือข่ายเป็นโฮสต์
ต้องแปลงพอร์ตและที่อยู่เสมอ มิฉะนั้นคุณอาจสื่อสารกับปลายทางผิดแห่ง
การแปลงที่อยู่ IP
inet_pton แปลง IP ในรูปข้อความ เช่น "127.0.0.1" ให้เป็นรูปแบบไบนารีที่เก็บใน sin_addr และ inet_ntop แปลงย้อนกลับเพื่อแสดงผล
#include <arpa/inet.h>
#include <netinet/in.h>
int set_ip(struct sockaddr_in *addr, const char *ip) {
return inet_pton(AF_INET, ip, &addr->sin_addr); /* returns 1 on success */
}ลำดับการเรียกของเซิร์ฟเวอร์
โดยทั่วไปเซิร์ฟเวอร์ TCP จะเรียกใช้ตามลำดับดังนี้:
socket()สร้างbind()ผูกกับที่อยู่และพอร์ตlisten()กำหนดให้เป็นโหมดรอรับaccept()รับการเชื่อมต่อ
ลำดับการเรียกของไคลเอนต์
ไคลเอนต์ TCP มีขั้นตอนง่ายกว่า:
socket()สร้างconnect()ติดต่อไปยังที่อยู่ของเซิร์ฟเวอร์
จากนั้นจึงใช้ send และ recv กับเดสคริปเตอร์เดียวกันได้
การส่งและการรับ
ใช้ send() และ recv() (หรือ write() และ read() แบบทั่วไป) ทั้งสองฟังก์ชันอาจถ่ายโอนไบต์ได้น้อยกว่าที่ร้องขอ ดังนั้นโค้ดจริงจึงต้องวนซ้ำจนกว่าจะจัดการข้อมูลทั้งหมด
ตรวจสอบค่าที่ส่งคืนเสมอ
การเรียกใช้ซ็อกเก็ตทุกครั้งอาจล้มเหลว หากส่งคืนค่า -1 จะกำหนดค่าให้ errno ให้เรียก perror เพื่อรายงานข้อผิดพลาด การที่ recv ส่งคืนค่า 0 หมายความว่าอีกฝั่งปิดการเชื่อมต่อแล้ว ระบบเครือข่ายที่มีความทนทานขึ้นอยู่กับการตรวจสอบข้อผิดพลาด
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับพื้นฐานซ็อกเก็ต
สรุปทบทวน
คุณได้เรียนรู้พื้นฐานของการเขียนโปรแกรมซ็อกเก็ต
- ซ็อกเก็ตคือปลายทางเครือข่ายและไฟล์เดสคริปเตอร์
- รูปแบบไคลเอนต์-เซิร์ฟเวอร์ใช้ TCP (เชื่อถือได้) หรือ UDP (รวดเร็ว)
- ใช้
sockaddr_inร่วมกับhtonsและinet_pton - เซิร์ฟเวอร์: socket, bind, listen, accept ไคลเอนต์: socket, connect
เรียนรู้ C ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 39
- บทเรียน
- 144
คำถามที่พบบ่อย
บทเรียน “ภาพรวมซ็อกเก็ต” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ภาพรวมซ็อกเก็ต” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ภาพรวมซ็อกเก็ต”
พื้นฐานการสื่อสารเครือข่าย คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ภาพรวมซ็อกเก็ต” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมซ็อกเก็ต
- เซิร์ฟเวอร์ TCP
- ไคลเอ็นต์ TCP
- การจัดการไคลเอ็นต์หลายราย