高级IO复用应用:聊天室程序

本文介绍了一个高级IO复用应用——聊天室程序,客户端利用splice实现零拷贝提高效率,服务端则通过空间换时间策略,分配大数组存储用户数据并快速索引。该程序展示了IO复用poll技术在实际场景中的应用。
摘要由CSDN通过智能技术生成

简单的聊天室程序:客户端从标准输入输入数据后发送给服务端,服务端将用户发送来的数据转发给其它用户。这里采用IO复用poll技术。客户端采用了splice零拷贝。服务端采用了空间换时间(分配超大的用户数据数组,然后通过用户连接的文件描述符即可以索引到用户数据)

客户端程序:

#define _GNU_SOURCE 1//为了支持POLLRDHUP事件
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<poll.h>
#include<fcntl.h>
#include<iostream>
#define BUFFER_SIZE 64
using namespace std;
int main(int argc,char* argv[]){
    if(argc<=2){
        cout<<"argc<=2"<<endl;
        return 1;
    }
    const char* ip=argv[1];//服务端地址
    int port=atoi(argv[2]);
    struct sockaddr_in address;
    bzero(&address,sizeof(address));
    address.sin_family=AF_INET;
    inet_pton(AF_INET,ip,&address.sin_addr);
    address.sin_port=htons(port);
    int sockfd=socket(PF_INET,SOCK_STREAM,0);
    assert(sockfd>=0);
    if(connect(sockfd,(struct sockaddr*)&address,sizeof(address))<0){
        cout<<"connect error"<<endl;
        close(sockfd);
        return 1;
    }
    pollfd fds[2];//pollfd结构体数组
    fds[0].fd=0;//fds[0]是标准输入
    fds[0].events=POLLIN;//注册可写事件
    fds[0].revents=0;
    fds[1].fd=sockfd;//fds[1]是socket描述符
    fds[1].events=POLLIN|POLLRDHUP;//注册可写和挂起事件
    fds[1].revents=0;
    char read_buf[BUFFER_SIZE];
    int pipefd[2];
    int ret=pipe(pipefd);//创建一个管道,splice函数的参数必须有个是管道描述符(实现零拷贝)
    assert(ret!=-1);
    while(1){
        ret=poll(fds,2,-1);//无限期等待注册事件发生
        if(ret<0){
            cout<<"poll error"<<endl;
            break;
        
聊天室项目中,IO多路复用是一种常用的技术,用于同时处理多个客户端的输入输出。通过使用IO多路复用,可以避免为每个客户端创建一个线程或进程来处理输入输出,从而提高系统的性能和可扩展性。 在使用IO多路复用时,可以使用select、poll或epoll等系统调用来实现。这些调用可以监视多个文件描述符(包括套接字)的状态,并在有事件发生时通知应用程序。通过将多个文件描述符传递给这些系统调用,应用程序可以同时监听多个客户端的输入输出。 在使用select时,需要使用fd_set数据结构来管理文件描述符的状态。fd_set实际上是一个数组的宏定义,每个数组元素与一个文件描述符建立联系。当调用select时,内核会根据文件描述符的状态修改fd_set的内容,从而通知应用程序哪些文件描述符可读或可写。 在使用poll时,需要使用struct pollfd结构体来管理文件描述符的状态。pollfd结构体包含了文件描述符的信息以及感兴趣的事件类型。调用poll时,内核会修改pollfd结构体的revents字段,以通知应用程序哪些文件描述符可读或可写。 在使用epoll时,需要使用epoll_create、epoll_ctl和epoll_wait等函数来管理文件描述符的状态。epoll使用一个事件驱动的模型,通过注册事件和等待事件的方式来实现IO多路复用。epoll可以高效地处理大量的并发连接。 综上所述,IO多路复用是在聊天室项目中常用的技术,可以同时处理多个客户端的输入输出,提高系统的性能和可扩展性。可以使用select、poll或epoll等系统调用来实现IO多路复用,并根据具体的需求选择合适的方法。 #### 引用[.reference_title] - *1* *2* *3* [IO多路复用技术总结](https://blog.csdn.net/qigeminghao/article/details/122004757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值