ไคลเอ็นต์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ