浪潮君 的學(xué)生作業(yè):
#include // 提供標準輸入輸出函數(shù)(如 printf)
#include // 提供 exit(), malloc() 等函數(shù)
#include // 提供字符串處理函數(shù),如 memset(), strcmp()
#include // 提供 close(), read(), write() 等函數(shù)
#include // 提供 IP 地址轉(zhuǎn)換與套接字相關(guān)函數(shù)(如 inet_pton)
// ------------------ 常量定義 ------------------
#define SERVER_IP "127.0.0.1" // 要連接的服務(wù)器 IP(本地回環(huán)地址)
#define SERVER_PORT 8888 // 服務(wù)器端口號
#define BUFFER_SIZE 1024 // 接收/發(fā)送緩沖區(qū)大小
int main() {
int sockfd; // 與服務(wù)器通信的 socket 文件描述符
struct sockaddr_in server_addr; // 服務(wù)器地址結(jié)構(gòu)體
char buffer[BUFFER_SIZE]; // 數(shù)據(jù)緩沖區(qū)
// ---------- 1. 創(chuàng)建 TCP socket ----------
sockfd = socket(AF_INET, SOCK_STREAM, 0); // 創(chuàng)建面向連接的 IPv4 套接字
if (sockfd < 0) {
perror("socket 創(chuàng)建失敗"); // 如果創(chuàng)建失敗,打印錯誤并退出
exit(1);
}
// ---------- 2. 配置服務(wù)器地址 ----------
memset(&server_addr, 0, sizeof(server_addr)); // 清空結(jié)構(gòu)體內(nèi)存
server_addr.sin_family = AF_INET; // 設(shè)置地址族為 IPv4
server_addr.sin_port = htons(SERVER_PORT); // 設(shè)置端口號(主機字節(jié)序 → 網(wǎng)絡(luò)字節(jié)序)
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr); // IP 地址字符串 → 網(wǎng)絡(luò)格式
// ---------- 3. 主動連接服務(wù)器 ----------
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("連接服務(wù)器失敗"); // 若連接失敗,關(guān)閉 socket 并退出
close(sockfd);
exit(1);
}
printf("已連接服務(wù)器 %s:%d\n", SERVER_IP, SERVER_PORT);
// ---------- 4. 通信主循環(huán) ----------
while (1) {
printf("請輸入消息(exit 退出):");
fflush(stdout); // 清空輸出緩沖區(qū),確保提示立即打印
// 從標準輸入讀取一行字符串到 buffer 中
if (fgets(buffer, sizeof(buffer), stdin) == NULL)
break;
// 移除換行符(fgets 會保留 \n)
buffer[strcspn(buffer, "\n")] = '\0';
// ---------- 4.1 判斷是否是退出指令 ----------
if (strcmp(buffer, "exit") == 0) {
send(sockfd, buffer, strlen(buffer), 0); // 通知服務(wù)器退出
printf("客戶端已斷開連接。\n");
break; // 跳出通信循環(huán),準備退出
}
// ---------- 4.2 向服務(wù)器發(fā)送消息 ----------
send(sockfd, buffer, strlen(buffer), 0); // 發(fā)送用戶輸入的內(nèi)容給服務(wù)器
// ---------- 4.3 等待服務(wù)器響應(yīng) ----------
ssize_t len = recv(sockfd, buffer, sizeof(buffer) - 1, 0); // 接收服務(wù)器返回的數(shù)據(jù)
if (len