|
案例
案例一
server.c
[code]#include // 标准输入输出#include //提供通用的工具函数,例如内存分配和程序退出。#include //提供字符串处理函数。#include //提供对 POSIX 操作系统 API 的访问,包括对文件描述符的操作。#include //提供与 Internet 地址转换相关的函数和数据结构。#define PORT 8082 //PORT 是服务器监听的端口号,设置为 8082。#define BUFFER_SIZE 1024 //定义了缓冲区的大小,用于接收数据,设置为 1024 字节。int main(){ int server_fd; //用于存储服务器套接字的文件描述符 int new_socket; //客户端连接的套接字描述符 struct sockaddr_in address; //sockaddr_in 结构体,表示服务器的地址信息。 int opt = 1; //用于设置套接字选项(端口重用)。 int addrlen = sizeof(address); //服务器地址结构的大小。 char buffer[BUFFER_SIZE] = {0}; //用于接收客户端发送的消息,并初始化为零。 /*使用 socket 函数创建一个套接字。参数 AF_INET 指定使用 IPv4,SOCK_STREAM 表示使用 TCP 协议。 *如果创建失败,函数返回值为 -1,输出错误信息并退出程序。*/ if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("server create failed\n"); exit(EXIT_FAILURE); } /*使用 setsockopt 函数允许套接字重用地址。 *设置选项 SO_REUSEADDR,这使得即使在套接字关闭后,新的套接字也可以绑定到同一端口。 *如果设置选项失败,输出错误信息并退出程序。*/ if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } // 配置服务器地址结构 address.sin_family = AF_INET; //设置 address 的地址家族为 AF_INET,表示 IPv4。 // address.sin_addr.s_addr = INADDR_ANY; //使用 INADDR_ANY,表示服务器将监听所有可用的网络接口。 /*将字符串格式的 IP 地址("127.0.0.1")转换为二进制格式并存储在 serv_addr.sin_addr 中。这个IP地址指的是本机。*/ if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) |
|