ubuntu
// server.c
#include <stdio.h> // 标准输入输出库
#include <stdlib.h> // 标准库,包含了通用的函数,如 malloc, exit
#include <string.h> // 字符串处理函数库
#include <unistd.h> // Unix 标准函数库,包含 read, write, close 等
#include <arpa/inet.h> // 提供了互联网操作的定义
#define PORT 65432 // 定义服务器将要监听的端口号
#define BUFFER_SIZE 1024 // 定义缓冲区的大小
int main() {
int server_fd, new_socket;
struct sockaddr_in address; // 存储地址信息的结构体
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0}; // 用于存储接收到的数据
// 创建一个 TCP socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed"); // 创建失败时输出错误信息
exit(EXIT_FAILURE); // 退出程序
}
// 设置服务器的 IP 地址和端口号
address.sin_family = AF_INET; // 设置地址族为 IPv4
address.sin_addr.s_addr = INADDR_ANY; // 监听本地所有 IP 地址
address.sin_port = htons(PORT); // 将端口号转换为网络字节序
// 绑定 socket 到指定的 IP 地址和端口号
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed"); // 绑定失败时输出错误信息
close(server_fd); // 关闭 socket
exit(EXIT_FAILURE); // 退出程序
}
// 使 socket 进入监听状态,准备接受客户端连接
if (listen(server_fd, 3) < 0) {
perror("listen failed"); // 监听失败时输出错误信息
close(server_fd); // 关闭 socket
exit(EXIT_FAILURE); // 退出程序
}
printf("等待连接...\n");
// 接受客户端连接请求
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed"); // 接受连接失败时输出错误信息
close(server_fd); // 关闭 socket
exit(EXIT_FAILURE); // 退出程序
}
printf("连接成功\n");
// 从客户端接收数据
int bytes_read = read(new_socket, buffer, BUFFER_SIZE);
printf("接收到: %s\n", buffer);
// 将接收到的数据回传给客户端
send(new_socket, buffer, bytes_read, 0);
printf("回显消息已发送\n");
// 关闭连接和 socket
close(new_socket);
close(server_fd);
return 0;
}
客户端代码
// client.c
#include <stdio.h> // 标准输入输出库
#include <stdlib.h> // 标准库,包含了通用的函数,如 malloc, exit
#include <string.h> // 字符串处理函数库
#include <winsock2.h> // Windows 套接字编程库
#pragma comment(lib, “ws2_32.lib”) // 链接 Winsock 库
#define PORT 65432 // 服务器的端口号
#define BUFFER_SIZE 1024 // 缓冲区大小
int main() {
WSADATA wsa; // 存储 Winsock 数据的结构体
SOCKET sock; // 套接字
struct sockaddr_in server; // 存储服务器地址信息的结构体
char buffer[BUFFER_SIZE] = “Hello, Server!”; // 要发送的消息
char server_reply[BUFFER_SIZE] = {0}; // 存储服务器的响应
// 初始化 Winsock
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) {
printf("WSAStartup failed. Error Code : %d", WSAGetLastError());
return 1;
}
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
printf("Could not create socket : %d", WSAGetLastError());
return 1;
}
// 配置服务器的 IP 地址和端口号
server.sin_addr.s_addr = inet_addr("服务器IP地址"); // 替换为实际的服务器 IP
server.sin_family = AF_INET; // 使用 IPv4 地址族
server.sin_port = htons(PORT); // 端口号转换为网络字节序
// 连接到服务器
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
printf("connect error");
return 1;
}
printf("已连接到服务器\n");
// 向服务器发送数据
if (send(sock, buffer, strlen(buffer), 0) < 0) {
printf("发送失败");
return 1;
}
printf("数据已发送: %s\n", buffer);
// 接收来自服务器的数据
if (recv(sock, server_reply, BUFFER_SIZE, 0) < 0) {
printf("接收失败");
}
printf("接收到: %s\n", server_reply);
// 关闭套接字并清理 Winsock
closesocket(sock);
WSACleanup();
return 0;
}