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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- API ซ็อกเก็ต BSD ใน C++
- การสร้างเซิร์ฟเวอร์สะท้อน TCP
- IO แบบอะซิงโครนัสด้วย epoll และ kqueue
- การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่