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

ไคลเอ็นต์ TCP

เชื่อมต่อและส่งข้อมูล

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

การสร้างไคลเอนต์ TCP

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

ขั้นตอนที่ 1: สร้างซ็อกเก็ต

เช่นเดียวกับเซิร์ฟเวอร์ ให้สร้างซ็อกเก็ตแบบสตรีมสำหรับ IPv4 TCP

#include <sys/socket.h>
#include <stdio.h>

int make_client_socket(void) {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) perror("socket");
    return fd;
}

ขั้นตอนที่ 2: ระบุเซิร์ฟเวอร์

เติมพอร์ตและ IP ของเซิร์ฟเวอร์ลงใน sockaddr_in ใช้ inet_pton เพื่อแปลงสตริง IP แบบมีจุดให้เป็นรูปแบบไบนารี

#include <arpa/inet.h>
#include <netinet/in.h>

int set_server(struct sockaddr_in *addr, const char *ip, unsigned short port) {
    addr->sin_family = AF_INET;
    addr->sin_port = htons(port);
    return inet_pton(AF_INET, ip, &addr->sin_addr); /* 1 on success */
}

ขั้นตอนที่ 3: เชื่อมต่อ

connect() ดำเนินการจับมือของ TCP กับเซิร์ฟเวอร์ เมื่อสำเร็จ ซ็อกเก็ตจะพร้อมรับส่งข้อมูล หากล้มเหลว จะกำหนดค่าให้ errno (เช่น การเชื่อมต่อถูกปฏิเสธ)

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int do_connect(int fd, struct sockaddr_in *addr) {
    if (connect(fd, (struct sockaddr *)addr, sizeof *addr) < 0) {
        perror("connect"); return -1;
    }
    return 0;
}

ไม่จำเป็นต้องใช้ bind

โดยทั่วไปไคลเอนต์จะข้าม bind เนื่องจากเคอร์เนลจะกำหนดพอร์ตต้นทางแบบชั่วคราวให้อัตโนมัติระหว่าง connect คุณจะผูกไคลเอนต์ก็ต่อเมื่อจำเป็นต้องใช้พอร์ตต้นทางที่ระบุไว้

ขั้นตอนที่ 4: ส่งข้อมูล

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

#include <sys/socket.h>
#include <string.h>

int send_all(int fd, const char *data) {
    size_t left = strlen(data);
    const char *p = data;
    while (left > 0) {
        ssize_t n = send(fd, p, left, 0);
        if (n <= 0) return -1;
        p += n; left -= (size_t)n;
    }
    return 0;
}

ขั้นตอนที่ 5: รับการตอบกลับ

อ่านการตอบกลับจากเซิร์ฟเวอร์ด้วย recv เติมตัวสิ้นสุดแบบ Null ก่อนถือว่าบัฟเฟอร์เป็นสตริง

#include <sys/socket.h>
#include <stdio.h>

void read_reply(int fd) {
    char buf[512];
    ssize_t n = recv(fd, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("server said: %s\n", buf); }
    else if (n == 0) printf("server closed connection\n");
}

อ่านจนกว่าจะปิดการเชื่อมต่อ

recv หนึ่งครั้งอาจไม่คืนค่าการตอบกลับทั้งหมด ให้วนซ้ำจนกว่า recv จะคืนค่า 0 (อีกฝั่งปิดการเชื่อมต่อแล้ว) เพื่ออ่านการตอบกลับทั้งหมดที่มาถึงเป็นส่วน ๆ

#include <sys/socket.h>
#include <stdio.h>

void drain(int fd) {
    char buf[256]; ssize_t n;
    while ((n = recv(fd, buf, sizeof buf, 0)) > 0)
        fwrite(buf, 1, (size_t)n, stdout);
}

ขั้นตอนที่ 6: ปิด

เรียก close(fd) เพื่อสิ้นสุดการเชื่อมต่อและคืนเดสคริปเตอร์ การดำเนินการนี้จะส่ง TCP FIN เพื่อให้เซิร์ฟเวอร์ทราบว่าไคลเอนต์ทำงานเสร็จแล้ว

#include <unistd.h>

void finish(int fd) {
    close(fd);
}

ปิดการเชื่อมต่อเพียงทิศทางด้วย shutdown

shutdown(fd, SHUT_WR) จะปิดเฉพาะทิศทางการเขียน ซึ่งเป็นสัญญาณว่าสิ้นสุดคำขอแล้ว แต่ยังอนุญาตให้ไคลเอนต์อ่านการตอบกลับได้ วิธีนี้มีประโยชน์สำหรับโพรโทคอลแบบส่งคำขอแล้วตอบกลับ

การจัดการความล้มเหลวในการเชื่อมต่อ

ข้อผิดพลาดทั่วไปของไคลเอ็นต์ ได้แก่ ECONNREFUSED (ไม่มีเซิร์ฟเวอร์กำลังรอรับการเชื่อมต่อ), ETIMEDOUT (ไม่สามารถเข้าถึงโฮสต์ได้) และ EHOSTUNREACH ตรวจสอบ connect เสมอ และรายงานความล้มเหลวให้ผู้ใช้อย่างชัดเจน

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับไคลเอ็นต์ TCP

สรุปทบทวน

คุณได้สร้างไคลเอ็นต์ TCP

  • สร้างซ็อกเก็ต จากนั้นเชื่อมต่อกับ sockaddr_in ของเซิร์ฟเวอร์
  • ไม่จำเป็นต้องใช้ bind; เคอร์เนลจะเลือกพอร์ตต้นทางให้
  • ส่งคำขอ แล้วรับการตอบกลับ (วนซ้ำเพื่อรับข้อมูลทั้งหมด)
  • เมื่อเสร็จแล้วให้ปิดหรือยุติการเชื่อมต่อ และจัดการความล้มเหลวในการเชื่อมต่อ

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

บทเรียน “ไคลเอ็นต์ TCP” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ไคลเอ็นต์ TCP”

เชื่อมต่อและส่งข้อมูล คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ไคลเอ็นต์ TCP” ใช้เวลานานแค่ไหน

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

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

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

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

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