Files
C-exp-collection/server-exp2/webclient.c

56 lines
2.4 KiB
C
Raw Normal View History

2026-05-28 08:48:01 +08:00
#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; // 程序正常退出
}