C Academy · บทเรียน

ภาพรวมซ็อกเก็ต

พื้นฐานการสื่อสารเครือข่าย

บทเรียน 1 จาก 413 ขั้นตอน

ภาพรวมซ็อกเก็ต เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวมซ็อกเก็ต
  2. เซิร์ฟเวอร์ TCP
  3. ไคลเอ็นต์ TCP
  4. การจัดการไคลเอ็นต์หลายราย
← กลับไปที่ C Academy