日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于套接字SOCKET的及时聊天

發(fā)布時(shí)間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于套接字SOCKET的及时聊天 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、基于select的I/O多路復(fù)用以及tcp和udp的即時(shí)聊天

1、tcp網(wǎng)絡(luò)編程簡(jiǎn)介示意圖

2、基于tcp協(xié)議以及select接口的即時(shí)聊天

頭文件:#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include<sys/select.h>
服務(wù)器端:#include"func.h" //傳遞兩個(gè)參數(shù),一個(gè)IP地址,一個(gè)端口號(hào) int main(int argc,char *argv[]) {if(3!=argc){printf("error argcs!\n");return -1;}int sfd; //ADDRESS FAMILY--> AFsfd=socket(AF_INET,SOCK_STREAM,0); //就有點(diǎn)類似于打開文件描述符if(-1==sfd){perror("socket");return -1;}struct sockaddr_in ser;ser.sin_family=AF_INET;ser.sin_port=htons(atoi(argv[2]));ser.sin_addr.s_addr=inet_addr(argv[1]);int ret;ret=bind(sfd,(struct sockaddr *)&ser,sizeof(ser));if(-1==ret){perror("bind");return -1;}listen(sfd,10); //打開監(jiān)聽int newfd; //用accept去接受客戶端的信息struct sockaddr_in cli;int len=sizeof(cli);//newfd=accept(sfd,(struct sockaddr *)&cli,&len);//printf("newfd is %d\n",newfd);char buf[128]={0};fd_set rdset,tempt;FD_ZERO(&tempt);FD_SET(sfd,&tempt);FD_SET(0,&tempt);static int flag=0;while(1){FD_ZERO(&rdset);//FD_SET(newfd,&rdset);//FD_SET(0,&rdset);memcpy(&rdset,&tempt,sizeof(fd_set));ret=select(10,&rdset,NULL,NULL,NULL);if(ret>0){if(FD_ISSET(sfd,&rdset)) {memset(buf,0,sizeof(buf));//printf("recv %d messages!\n",ret);newfd=accept(sfd,(struct sockaddr *)&cli,&len);if(newfd>0){printf("the client port is %d,it's ip %s\n",ntohs(cli.sin_port),inet_ntoa(cli.sin_addr));if(flag>0){printf("I am back!hony\n");}FD_SET(newfd,&tempt);flag++;}else{printf("accept error!\n");}}if(FD_ISSET(newfd,&rdset)) {memset(buf,0,sizeof(buf));ret=recv(newfd,buf,sizeof(buf),0);//printf("recv %d messages!\n",ret);if(ret>0){printf("%s\n",buf);}else{printf("byebye!\n");FD_CLR(newfd,&tempt);close(newfd);}}if(FD_ISSET(0,&rdset)){memset(buf,0,sizeof(buf));ret=read(0,buf,sizeof(buf));if(ret>0){ret=send(newfd,buf,strlen(buf)-1,0);//printf("%s\n",buf);} //printf("byebye!\n");}}}close(sfd);close(newfd);return 0; } 客戶端:#include"func.h"int main(int argc,char **argv) {if(3!=argc){printf("error argcs!\n");return -1;}int sfd;sfd=socket(AF_INET,SOCK_STREAM,0);printf("sfd is %d\n",sfd);if(-1==sfd){perror("socket");return -1;}struct sockaddr_in ser;memset(&ser,0,sizeof(ser));int ret;ser.sin_family=AF_INET;ser.sin_port=htons(atoi(argv[2]));ser.sin_addr.s_addr=inet_addr(argv[1]);ret=connect(sfd,(struct sockaddr*)&ser,sizeof(ser));char buf[20]={0};fd_set rdset;while(1){ FD_ZERO(&rdset);FD_SET(0,&rdset);FD_SET(sfd,&rdset);ret=select(4,&rdset,NULL,NULL,NULL);if(ret>0){if(FD_ISSET(0,&rdset)){memset(buf,0,sizeof(buf));ret=read(0,buf,sizeof(buf));//printf("read %d character\n",ret);if(ret>0){ret=send(sfd,buf,strlen(buf)-1,0);//printf("have send %d messages!\n",ret);}else{printf("byebye!\n");}}if(FD_ISSET(sfd,&rdset)){memset(buf,0,sizeof(buf));ret=recv(sfd,buf,sizeof(buf),0);if(ret>0){printf("%s\n",buf); }}}}close(sfd);return 0; }

二、基于udp通信以及select多路轉(zhuǎn)接模型的即時(shí)聊天

?1、基于udp的網(wǎng)絡(luò)編程簡(jiǎn)介示意圖

?????????????????????????????????? ???????????????????

2、基于udp和select接口的及時(shí)聊天

???????頭文件及部分?jǐn)?shù)據(jù)結(jié)構(gòu),同上所示

???????

服務(wù)器端:#include"func.h"int main(int argc,char **argv) {if(3!=argc){printf("error argcs!\n");return 0;}int ret,sfd;sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket");return -1;}struct sockaddr_in ser;memset(&ser,0,sizeof(ser));ser.sin_family=AF_INET;ser.sin_port=htons(atoi(argv[2]));ser.sin_addr.s_addr=inet_addr(argv[1]);ret=bind(sfd,(struct sockaddr *)&ser,sizeof(ser));//udp綁定后監(jiān)聽就打開了if(-1==ret){perror("bind");return -1;}fd_set rdset;char buf[128]={0};struct sockaddr_in cli;memset(&cli,0,sizeof(cli));int cli_len=sizeof(cli);static int flag=0,flag2=0;while(1){FD_ZERO(&rdset);FD_SET(0,&rdset);FD_SET(sfd,&rdset);ret=select(sfd+1,&rdset,NULL,NULL,NULL);if(ret>0){if(FD_ISSET(sfd,&rdset)){flag2=1;memset(buf,0,sizeof(buf));ret=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cli,&cli_len);flag=1;if(ret>0){printf("Client:%s",buf);}else{printf("byebye!\n");close(sfd);break;}}if(FD_ISSET(0,&rdset)&&flag==1){memset(buf,0,sizeof(buf));ret=read(0,buf,sizeof(buf));if(ret>0){ret=sendto(sfd,buf,strlen(buf)-1,0,(struct sockaddr *)&cli,cli_len);//printf("have sendto %d characters!\n",ret);}else{printf("byebye!\n");close(sfd);break;}}else{if(flag2==0)puts("please connect server first!then try again:");flag2=1;}}}}

?

客戶端:#include"func.h"int main(int argc,char **argv) {if(3!=argc){printf("errror argcs!\n");return -1;}int sfd,ret;sfd=socket(AF_INET,SOCK_DGRAM,0);if(-1==sfd){perror("socket");return -1;}struct sockaddr_in ser;memset(&ser,0,sizeof(ser));struct sockaddr_in cli;memset(&cli,0,sizeof(cli));int clilen=sizeof(cli);ser.sin_family=AF_INET;ser.sin_port=htons(atoi(argv[2]));ser.sin_addr.s_addr=inet_addr(argv[1]);fd_set rdset;char buf[128]={0};while(1){FD_ZERO(&rdset);FD_SET(0,&rdset);FD_SET(sfd,&rdset);ret=select(sfd+1,&rdset,NULL,NULL,NULL);if(ret>0){if(FD_ISSET(0,&rdset)){memset(buf,0,sizeof(buf));ret=read(0,buf,sizeof(buf));if(ret>0){ret=sendto(sfd,buf,sizeof(buf),0,(struct sockaddr *)&ser,clilen);}else{printf("byebye!\n");close(sfd);break;}}if(FD_ISSET(sfd,&rdset)){memset(buf,0,sizeof(buf));ret=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cli,&clilen);//printf("recv %d characters!\n",ret);//puts(buf);if(ret>0){puts(buf);}else{printf("byebye!\n");close(sfd);break;}}}} }

三、基于epoll多路復(fù)用的tcp簡(jiǎn)潔版及時(shí)聊天

1、?頭文件

#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include<sys/select.h> #include<sys/epoll.h>

2、服務(wù)器端

#include"func.h" //傳遞兩個(gè)參數(shù),一個(gè)IP地址,一個(gè)端口號(hào) int main(int argc,char *argv[]) {if(3!=argc){printf("error argcs!\n");return -1;}int sfd; //ADDRESS FAMILY--> AFsfd=socket(AF_INET,SOCK_STREAM,0); //就有點(diǎn)類似于打開文件描述符if(-1==sfd){perror("socket");return -1;}struct sockaddr_in ser;ser.sin_family=AF_INET;ser.sin_port=htons(atoi(argv[2]));ser.sin_addr.s_addr=inet_addr(argv[1]);int ret,ret1;ret=bind(sfd,(struct sockaddr *)&ser,sizeof(ser));if(-1==ret){perror("bind");return -1;}listen(sfd,10); //打開監(jiān)聽int newfd=-1; //用accept去接受客戶端的信息struct sockaddr_in cli;int len=sizeof(cli);char buf[128]={0};int epfd=epoll_create(1);struct epoll_event event,evs[3];memset(&event,0,sizeof(event)); //注冊(cè)標(biāo)準(zhǔn)輸入event.data.fd=STDIN_FILENO;event.events=EPOLLIN;ret=epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&event);if(-1==ret){perror("epoll_ctl");return -1;}event.data.fd=sfd;event.events=EPOLLIN;ret=epoll_ctl(epfd,EPOLL_CTL_ADD,sfd,&event);if(-1==ret){perror("epoll_ctl");return -1;}//static int flag=0;int i;while(1){memset(evs,0,sizeof(evs));ret1=epoll_wait(epfd,evs,3,-1); //-1是永久等待for(i=0;i<ret1;i++) {if(evs[i].data.fd==newfd) {memset(buf,0,sizeof(buf));ret=recv(newfd,buf,sizeof(buf),0);//printf("recv %d messages!\n",ret);if(ret>0){printf("%s\n",buf);}else if(0==ret){printf("byebye!\n");close(newfd);event.data.fd=newfd;event.events=EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_DEL,newfd,&event);//newfd=-1;//printf("one -1\n");}}if(evs[i].data.fd==sfd) {printf("sfd dengle~~\n");memset(buf,0,sizeof(buf));newfd=accept(sfd,(struct sockaddr *)&cli,&len);printf("newfd is %d\n",newfd);printf("the client port is %d,it's ip %s\n",ntohs(cli.sin_port),inet_ntoa(cli.sin_addr));//if(flag>0)//{// printf("I am back!hony\n");//}if(newfd==-1){perror("accept");return -1;}event.data.fd=newfd;event.events=EPOLLIN;ret=epoll_ctl(epfd,EPOLL_CTL_ADD,newfd,&event);if(-1==ret){perror("epoll_ctl");return -1;}//flag++;}if(evs[i].data.fd==0){memset(buf,0,sizeof(buf));ret=read(0,buf,sizeof(buf));if(ret>0){ret=send(newfd,buf,strlen(buf)-1,0);//printf("%s\n",buf);} //printf("byebye!\n");}}}close(sfd);close(newfd);return 0; }

3、客戶端:

#include"func.h"int main(int argc,char **argv) {if(3!=argc){printf("error argcs!\n");return -1;}int sfd;sfd=socket(AF_INET,SOCK_STREAM,0);printf("sfd is %d\n",sfd);if(-1==sfd){perror("socket");return -1;}struct sockaddr_in ser;memset(&ser,0,sizeof(ser));int ret;ser.sin_family=AF_INET;ser.sin_port=htons(atoi(argv[2]));ser.sin_addr.s_addr=inet_addr(argv[1]);ret=connect(sfd,(struct sockaddr*)&ser,sizeof(ser));char buf[20]={0};fd_set rdset;while(1){ FD_ZERO(&rdset);FD_SET(0,&rdset);FD_SET(sfd,&rdset);ret=select(4,&rdset,NULL,NULL,NULL);if(ret>0){if(FD_ISSET(0,&rdset)){memset(buf,0,sizeof(buf));ret=read(0,buf,sizeof(buf));printf("read %d character\n",ret);if(ret>0){ret=send(sfd,buf,strlen(buf)-1,0);printf("have send %d messages!\n",ret);}else{printf("byebye!\n");}}if(FD_ISSET(sfd,&rdset)){memset(buf,0,sizeof(buf));ret=recv(sfd,buf,sizeof(buf),0);if(ret>0){printf("%s\n",buf); }}}}close(sfd);return 0; }

總結(jié)

以上是生活随笔為你收集整理的基于套接字SOCKET的及时聊天的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。