Files
C-exp-collection/server-exp2/webclient.c
2026-05-28 08:48:01 +08:00

56 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <arpa/inet.h> // 提供IP地址转换函数
#include <netinet/in.h> // 提供套接字地址结构定义
#include <stdio.h> // 标准输入输出
#include <stdlib.h> // 标准库函数如exit()
#include <string.h> // 字符串操作函数
#include <sys/socket.h> // 套接字相关函数
#include <sys/types.h> // 数据类型定义
#include <unistd.h> // POSIX API如read()和write()
//#define PORT 8181 /* 目标服务器的端口号 */
//#define IP_ADDRESS "192.168.0.8" /* 目标服务器的IP地址 */
#define BUFSIZE 8196 /* 缓冲区大小 */
char *command = "GET /index.html HTTP/1.0 \r\n\r\n"; /* HTTP GET 请求命令 */
// 错误处理函数,打印错误信息并退出程序
void pexit(char *msg) {
perror(msg); // 打印错误信息
exit(1); // 退出程序
}
int main(int argc, char *argv[]) {//客户端启动命令为"./client 127.0.0.1 8088",argv[1]是IP地址argv[2]是端口号8088
int i, sockfd; // sockfd是套接字文件描述符
char buffer[BUFSIZE]; // 用于存储从服务器接收的数据
struct sockaddr_in serv_addr; // 定义服务器地址结构
// 打印尝试连接服务器的信息
printf("客户端尝试连接到 %s 和端口 %s\n", argv[1], argv[2]);
// 创建套接字使用IPv4和TCP协议
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) pexit("socket() 创建失败");
// 配置服务器地址
serv_addr.sin_family = AF_INET; // 地址族为IPv4
serv_addr.sin_addr.s_addr = inet_addr(argv[1]); // 设置服务器IP地址,如"127.0.0.1"
serv_addr.sin_port = htons(atoi(argv[2])); // 设置服务器端口号,如"8088"
// 尝试连接到服务器
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
pexit("connect() 连接失败");
// 发送HTTP GET请求到服务器
printf("发送字节数=%ld %s\n", strlen(command), command);
if (write(sockfd, command, strlen(command)) < 0) pexit("write() 发送请求失败");
// 循环读取服务器返回的数据,并输出到标准输出
while ((i = read(sockfd, buffer, BUFSIZE)) > 0) {
if (write(1, buffer, i) < 0) // 1表示标准输出
pexit("write() 输出到标准输出失败");
}
// 关闭套接字,释放资源
close(sockfd);
return 0; // 程序正常退出
}