在C语言中,套接字编程主要涉及以下步骤:
创建套接字
使用`socket()`函数创建一个套接字。这个函数需要指定三个参数:地址族(如`AF_INET`表示IPv4地址)、套接字类型(如`SOCK_STREAM`表示TCP连接)和协议(通常为0,表示使用默认协议)。
绑定套接字
创建套接字后,需要将其绑定到一个特定的IP地址和端口号上。这通过`bind()`函数实现,需要提供套接字文件描述符、地址结构体(如`sockaddr_in`)和地址结构体的大小。
监听连接
服务器端的套接字需要监听来自客户端的连接请求。使用`listen()`函数来实现,该函数接受一个套接字文件描述符和一个表示最大等待连接请求数的参数。
接受连接
服务器端的套接字使用`accept()`函数来接受客户端的连接请求,从而创建一个新的套接字来处理客户端的请求。`accept()`函数返回一个新的套接字文件描述符和客户端的地址信息。
连接到服务器
客户端的套接字使用`connect()`函数来发起对服务器的连接请求。需要提供服务器地址和端口号。
发送和接收数据
一旦建立了连接,客户端和服务器都可以使用`send()`和`recv()`函数来发送和接收数据。
关闭套接字
通信完成后,需要使用`close()`函数来关闭套接字。
```c
include include include include include include define PORT 8080 int main() { int server_fd, client_fd, addr_len; struct sockaddr_in server_addr, client_addr; char buffer = {0}; // 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 配置服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); // 绑定套接字 if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } addr_len = sizeof(client_addr); // 接受连接 if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, (socklen_t *)&addr_len)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 接收数据 read(client_fd, buffer, 1024); printf("Received from client: %s\n", buffer); // 发送数据 send(client_fd, "Hello from server!", 16, 0); printf("Sent to client: Hello from server!\n"); // 关闭套接字 close(client_fd); close(server_fd); return 0; } ``` 这个示例中,服务器监听8080端口,接受客户端连接后,接收客户端发送的数据并回复“Hello from server!”。 建议在实际编程中,根据具体需求调整代码,例如处理多个客户端连接、使用多线程或多进程处理并发连接等。