当前位置: 首页 > Linux

一个简单的基于linux原生异步io的聊天程序

时间:2023-04-06 19:21:54 Linux

分为两个独立的程序,编译前确定自己的服务器地址。比如你想在自己的ubuntu下运行,首先使用ipaddr获取自己的ip地址,将chat_server.c和chat_client.c中的ip地址修改为自己的ip地址服务器chat_server.c编译:gccchat_server.c-o服务器运行:h>#include#include#include#include#defineMAX_USER500#defineMAX_MSG_LEN1024#defineMAX_IO_RETRY_TIMES5intserver_fd;intuser_cnt=0;intuser_fds[MAX_USER];charmsg_buffer[MAX_MSG_LEN];voiddown(){inti;for(i=0;i=2){intport=atoi(argv[1]);如果(端口>20000){端口号=端口;}}printf("端口=%d\n",端口号);server_addr.sin_port=端口号;if(-1==bind(server_fd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))){printf("binderr\n");返回-1;}printf("绑定成功\n");if(-1==listen(server_fd,MAX_USER)){printf("listenerr\n");返回-1;}printf("听好了\n");诠释我;fd_setfds;结构时间电视;while(go_on){FD_ZERO(&fds);FD_SET(server_fd,&fds);for(i=0;ifd_cnt_to_selected){fd_cnt_to_selected=user_fds[i];}}fd_cnt_to_selected=(0==user_cnt)?(server_fd+1):(fd_cnt_to_selected+1);tv.tv_sec=2;tv.tv_usec=0;intret=select(fd_cnt_to_selected,&fds,0,0,&tv);if(ret<0){printf("选择错误\n");休息;}elseif(0==ret){继续;}结构sockaddr_inclient_addr;for(i=0;i#include#include#include#include#include#include#includeintcfd=0;structpasswd*pwd;voidsig_handler(intsignal){charbye_msg[1024]={0};sprintf(bye_msg,"WARNING----->User[%s]已经走了,他说所有都是'SB'!哦,他妈的!",pwd->pw_name);写(cfd,bye_msg,1024);关机(cfd,SHUT_RDWR);关闭(差价合约);差价合约=0;exit(-1);}void*f(void*t){structtimevaltv;fd_setfds;while(1){tv.tv_sec=0;tv.tv_usec=100;FD_ZERO(&fds);FD_SET(cfd,&fds);intr=select(cfd+1,&fds,0,0,&tv);if(r<0){printf("选择错误\n");}否则如果(r==0){}charbuf[1024*10]={0};intn=read(cfd,buf,1024*10);如果(buf[0]!=0)printf("%s\n",buf);}}intmain(intargc,char*argv[]){信号(SIGINT,sig_handler);pwd=getpwuid(getuid());诠释字节;intsin_size;字符缓冲区[1024]={0};结构sockaddr_ins_add,c_add;无符号短端口号=0x8888;如果(argc>=2){intport=atoi(argv[1]);如果(端口>20000)端口号=端口;}printf("端口=%d\n",端口号);cfd=socket(AF_INET,SOCK_STREAM,0);if(-1==cfd){printf("套接字错误\n");返回-1;}//printf("套接字正常\n");bzero(&s_add,sizeof(structsockaddr_in));s_add.sin_family=AF_INET;s_add.sin_addr.s_addr=inet_addr("192.168.60.104");s_add.sin_port=htons(portnum);if(-1==connect(cfd,(structsockaddr*)(&s_add),sizeof(structsockaddr))){printf("connecterr\n");return-1;}charpersonal_info[128]={0};sprintf(personal_info,"DouBi[%s]iscoming!!!HaHaaa^-^",pwd->pw_name);write(cfd,personal_info,128);//printf("connectok\n");pthread_tth;intrr=pthread_create((pthread_t*)&th,NULL,f,NULL);while(1){//printf("输入你想说的:_\n");charb[10240]={0};sprintf(b,"[%s]:",pwd->pw_name);gets(b+strlen(b));//printf("b=%s\n",b);if(-1==(recbytes=write(cfd,b,1024*10))){printf("发送数据错误\n");return-1;}//printf("sendok\n");}//close(cfd);//sleep(100);return0;}