0Pricing
C++ Academy · บทเรียน

API ซ็อกเก็ต BSD ใน C++

ใช้ socket, bind, listen, accept, connect, send และ recv ในโปรแกรม C++

API ซ็อกเก็ต BSD ใน C++ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

ส่วนติดต่อการเขียนโปรแกรมสำหรับซ็อกเก็ตคืออะไร

ส่วนติดต่อการเขียนโปรแกรมซ็อกเก็ตของ BSD เป็นมาตรฐานโดยพฤตินัยสำหรับการเขียนโปรแกรมเครือข่าย ใช้งานได้บน Linux, macOS, BSD และ Windows ผ่าน Winsock โดยต้องปรับเปลี่ยนเล็กน้อย

ส่วนหัวที่จำเป็น

รวมส่วนหัวของแพลตฟอร์มและใช้ชนิดข้อมูลของ POSIX

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

การสร้างซ็อกเก็ต

การเรียก socket จะส่งคืนตัวระบุไฟล์ ให้ส่งตระกูล (IPv4) ชนิด (TCP หรือ UDP) และโพรโทคอล (0 เพื่อใช้ค่าเริ่มต้น)

int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
    perror("socket");
    return 1;
}

โครงสร้างที่อยู่

struct sockaddr_in เก็บที่อยู่ IPv4 และพอร์ต ให้แปลงเป็น struct sockaddr* เมื่อนำไปส่งให้ฟังก์ชัน

struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

ลำดับไบต์: โฮสต์เทียบกับเครือข่าย

ลำดับไบต์ของเครือข่ายเป็นแบบบิ๊กเอนเดียน ใช้ htons, htonl, ntohs, ntohl เพื่อแปลงค่า

การเชื่อมต่อจากไคลเอ็นต์

ใช้ connect เพื่อเริ่มการเชื่อมต่อ TCP

if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
    perror("connect");
    close(sock);
    return 1;
}

การส่งและรับข้อมูล

send และ recv ใช้แลกเปลี่ยนไบต์ ทั้งสองฟังก์ชันอาจส่งคืนข้อมูลน้อยกว่าที่ร้องขอ ดังนั้นต้องวนซ้ำเสมอ

const char* msg = "Hello";
send(sock, msg, strlen(msg), 0);

char buffer[1024];
ssize_t n = recv(sock, buffer, sizeof(buffer)-1, 0);
buffer[n] = '\0';

การผูกที่อยู่และการรอรับการเชื่อมต่อ (เซิร์ฟเวอร์)

เซิร์ฟเวอร์จะผูกกับที่อยู่ รอรับการเชื่อมต่อ และรับการเชื่อมต่อ

int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
int client = accept(srv, nullptr, nullptr);

การปิดซ็อกเก็ต

เรียก close บน Unix หรือ closesocket บน Windows

close(sock);

การจัดการข้อผิดพลาด

ฟังก์ชันซ็อกเก็ตจะส่งคืน -1 เมื่อเกิดข้อผิดพลาดและกำหนดค่าให้ errno ตรวจสอบค่าที่ส่งคืนทุกครั้ง

การห่อหุ้มด้วย RAII

ตัวระบุไฟล์แบบเปล่ารั่วไหลได้ง่าย ให้ห่อหุ้มไว้ในชนิดข้อมูล RAII ที่เรียก close ในตัวทำลาย หรือใช้ std::unique_ptr พร้อมตัวลบแบบกำหนดเอง

struct SocketCloser {
    void operator()(int* fd) const { if (*fd >= 0) ::close(*fd); }
};
using UniqueSocket = std::unique_ptr<int, SocketCloser>;

ความแตกต่างบน Windows

บน Windows:

  • รวม <winsock2.h> และเชื่อมโยง ws2_32
  • เรียก WSAStartup ก่อนใช้งาน
  • ใช้ closesocket แทน close
  • ชนิดซ็อกเก็ตคือ SOCKET (ไม่มีเครื่องหมาย)

ตรวจสอบอย่างรวดเร็ว

การเรียกฟังก์ชันใดเป็นผู้เริ่มการเชื่อมต่อ TCP จากไคลเอ็นต์ไปยังเซิร์ฟเวอร์

สรุปทบทวน

ส่วนติดต่อการเขียนโปรแกรมซ็อกเก็ตของ BSD มีองค์ประกอบพื้นฐานสำหรับการสื่อสารเครือข่ายระดับต่ำ ให้สร้างซ็อกเก็ต กำหนดค่าที่อยู่ จากนั้นเชื่อมต่อสำหรับไคลเอ็นต์ หรือผูกที่อยู่+รอรับการเชื่อมต่อ+รับการเชื่อมต่อสำหรับเซิร์ฟเวอร์ แปลงลำดับไบต์ด้วยกลุ่มฟังก์ชัน htons ห่อหุ้มตัวระบุด้วย RAII เพื่อป้องกันการรั่วไหล

คำถามที่พบบ่อย

บทเรียน “API ซ็อกเก็ต BSD ใน C++” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “API ซ็อกเก็ต BSD ใน C++” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “API ซ็อกเก็ต BSD ใน C++”

ใช้ socket, bind, listen, accept, connect, send และ recv ในโปรแกรม C++ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “API ซ็อกเก็ต BSD ใน C++” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. API ซ็อกเก็ต BSD ใน C++
  2. การสร้างเซิร์ฟเวอร์สะท้อน TCP
  3. IO แบบอะซิงโครนัสด้วย epoll และ kqueue
  4. การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่
← กลับไปที่ C++ Academy