tcp并发用read和write 用多路复用的时候怎么只用了recv 没有用send函数
时间: 2024-05-20 13:14:21 浏览: 61
在使用 TCP 进行并发通信时,客户端和服务器端都需要使用 read 和 write 函数来发送和接收数据。但是,在使用多路复用(如 select、poll、epoll)的时候,我们只使用了 recv 函数而没有使用 send 函数,这是因为在多路复用模型下,我们只需要将所有的连接的文件描述符交给多路复用函数进行监听,当有一个或多个连接上有数据可读的时候,多路复用函数会返回这些连接的文件描述符,我们只需要遍历这些文件描述符,使用 recv 函数读取数据即可,而无需使用 send 函数发送数据。
在多路复用模型下,我们可以使用一个线程或进程来处理所有的连接,这样可以大大减少系统调用次数,提高程序的并发性能。此外,使用多路复用还可以有效地解决 C10K 问题,即如何处理大量的并发连接。
相关问题
TCP多进程并发服务器编程步骤,写出关键步骤的函数
TCP多进程并发服务器编程通常采用Unix/Linux环境下的socket编程,以下是关键步骤以及对应的函数:
1. **初始化并创建套接字**:
- 使用`socket()`函数创建一个新的网络套接字,可以设置为非阻塞模式。
```c
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
```
2. **绑定地址和端口**:
- 使用`bind()`函数将套接字绑定到特定的IP地址和端口号。
```c
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port_number);
inet_pton(AF_INET, "0.0.0.0", &server_addr.sin_addr);
bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
```
3. **设置监听**:
- 设置套接字为监听状态,并指定最大连接数,通过`listen()`函数。
```c
listen(server_socket, MAX_CONNECTIONS);
```
4. **创建客户端处理程序**:
- 当有新连接时,使用`accept()`函数创建新的进程或线程来处理每个请求,返回的是客户端的新套接字。
```c
int client_socket = accept(server_socket, NULL, NULL);
pid_t client_pid = fork(); // 创建子进程
if (client_pid == 0) {
// 子进程处理客户端请求
} else {
close(client_socket); // 父进程中关闭已接受的连接
}
```
5. **读取、解析请求数据**:
- 在子进程中,使用`recv()`或`read()`从客户端接收数据,并解析请求内容。
6. **响应客户端**:
- 根据请求处理业务逻辑,生成相应数据,然后使用`send()`或`write()`发送回客户端。
7. **关闭连接**:
- 完成服务后,记得关闭与客户端的通信套接字,释放资源。
8. **终止子进程**:
- 在子进程中,完成任务后,使用`exit()`结束进程。
9. **循环监听**:
- 在主进程中,继续监听新的连接,直到需要停止服务。
注意:这是一个简化版本的描述,实际编程时可能还需要处理异常、错误检查和其他细节。此外,Linux环境下还可能使用epoll等高效IO多路复用机制来提高性能。
阅读全文