久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Linux下select異步通訊怎么實現

142次閱讀
沒有評論

共計 5844 個字符,預計需要花費 15 分鐘才能閱讀完成。

這篇“Linux 下 select 異步通訊怎么實現”文章的知識點大部分人都不太理解,所以丸趣 TV 小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Linux 下 select 異步通訊怎么實現”文章吧。

1. 服務器端

/*select_server.c 2011.9.2 by yyg*/
#include  stdio.h 
#include  stdlib.h 
#include  errno.h 
#include  string.h 
#include  sys/types.h 
#include  netinet/in.h 
#include  sys/socket.h 
#include  sys/wait.h 
#include  pthread.h 
#include  sys/wait.h 
#include  sys/time.h 
#include  arpa/inet.h 
#include  unistd.h 
#define MAXBUF 1024
int main(int argc,char **argv){
 int sockfd,new_fd;
 socklen_t len;
 struct sockaddr_in my_addr,their_addr;
 unsigned int myport,lisnum;
 char buf[MAXBUF+1];
 fd_set rfds;
 struct timeval(argv[1]){ myport = atoi(argv[1]);
 }
 else
 myport = 7838;
 if(argv[2]){ lisnum = atoi(argv[2]);
 }
 else
 lisnum =2;
 if((sockfd = socket(PF_INET,SOCK_STREAM,0))== -1){
 perror( socket 
 exit(1);
 }
 bzero(my_addr,sizeof(my_addr));
 my_addr.sin_family = PF_INET;
 my_addr.sin_port = htons(myport);
 if(argv[3])
 my_addr.sin_addr.s_addr = INADDR_ANY;
 
 if(bind(sockfd,(struct sockaddr *) my_addr,sizeof(struct sockaddr)) == -1){
 perror( bind 
 exit(1);
 }
 
 if(listen(sockfd, lisnum) == -1){
 perror( listen 
 exit(1);
 }
 
 while(1){
 printf( \n----waiting for new connecting to start new char----\n 
 len = sizeof(struct sockaddr);
 if((new_fd = accept(sockfd,(struct sockaddr *) their_addr, len)) == -1){
 perror( accept 
 exit(errno);
 }
 else
 printf( server:got connection from %s,port %d,socked %d\n ,\
 inet_ntoa(their_addr.sin_addr),\
 ntohs(their_addr.sin_port),new_fd);
 
 /* 開始處理每個新連接上的數據收發 */
 //printf( \n---ready to go.now you can chatting...input enter,then you can chat---\n 
 while(1){
 /* 把集合清空 */
 FD_ZERO(rfds);
 /* 把標準輸入句柄 0 加入到集合中 */
 FD_SET(0, rfds);
 maxfd = 0;
 /* 把當前連接句柄 new_fd 加入到集合中 */
 FD_SET(new_fd, rfds);
 if(new_fd   maxfd)
 maxfd = new_fd;
 /* 設置最大等待時間 */
 tv.tv_sec = 1;
 tv.tv_usec = 0;
 retval = select(maxfd+1, rfds,NULL,NULL, tv);
 if(retval == -1){ printf( select error!%s\n ,strerror(errno));
 break;
 }
 else if(retval == 0){
 //printf( no message come,user no press the button,please wait...\n 
 continue;
 }
 else{ if(FD_ISSET(new_fd, rfds)){
 /* 連接的 socket  上有消息則接收并顯示 */
 bzero(buf,MAXBUF+1);
 /* 接收對方發過來的消息,最多 MAXBUF 字節 */
 len = recv(new_fd, buf, MAXBUF, 0);
 if(len   0)
 printf(recv msg success:%s! %d bytes rcv.\n  ,buf,len);
 else{ if(len   0){ printf( recv msg fail.the errno is:%d,error info is %s.\n ,errno,strerror(errno));
 }
 else
 printf( quit.\n 
 break;
 }
 }// FD_ISSET = sockfd 情況
 if(FD_ISSET(0, rfds)){
 /* 用戶有輸入了,則讀取其內容并發送 */
 bzero(buf, MAXBUF+1);
 fgets(buf, MAXBUF, stdin);
 if(!strncasecmp(buf,  quit , 4)){
 printf( self request to quit the chating\n 
 break;
 }
 /* 發消息給服務器 */
 len = send(new_fd, buf, strlen(buf)-1 , 0);
 if(len   0){ printf( mgs:%s send fail!errno is:%d,error info is:%s\n , buf, errno, strerror(errno));
 break;
 }else{ printf( msg: %s\t send success, send %d bytes!\n , buf, len);
 }
 }//FD_ISSET = 0
 
 }//select  處理結束
 
 }/* 內 while*/
 close(new_fd);
 /* 處理每個新連接上的數據收發結束 */
 printf(would you want to chatting with another one?(no- quit) 
 fflush(stdout);
 bzero(buf,MAXBUF+1);
 fgets(buf,MAXBUF,stdin);
 if(!strncasecmp(buf, no ,2)){
 printf( quit the chatting!\n 
 break;
 }
 
 }/* 外 while*/
 close(sockfd);
 return 0;
}

2. 客戶端

/*select_client.c 2011.9.2 by yyg*/
#include  stdio.h 
#include  stdlib.h 
#include  errno.h 
#include  string.h 
#include  sys/types.h 
#include  netinet/in.h 
#include  sys/socket.h 
#include  sys/wait.h 
#include  pthread.h 
#include  sys/time.h 
#include  arpa/inet.h 
#include  unistd.h 
#include  resolv.h 
#define MAXBUF 1024
int main(int argc,char **argv){
 int sockfd,len;
 struct sockaddr_in dest;
 char buffer[MAXBUF+1];
 fd_set rfds;
 struct timeval(argc != 3){
 printf( the param style wrong!\n 
 exit(0);
 }
 /* 創建一個 socket 用于 tcp 通信 */
 if((sockfd = socket(AF_INET,SOCK_STREAM,0))   0){
 perror( socket 
 exit(errno);
 }
 /* 初始化服務器端 (對方) 的地址和端口信息 */
 bzero(dest,sizeof(dest));
 dest.sin_family = AF_INET;
 dest.sin_port = htons(atoi(argv[2]));
 if(inet_aton(argv[1],(struct in_addr *) dest.sin_addr.s_addr) == 0){ perror(argv[1]);
 exit(errno);
 }
 /*conect to the server*/
 if(connect(sockfd,(struct sockaddr*) dest,sizeof(dest)) !=0){
 perror( connect 
 exit(errno);
 }
 printf( \n---ready to chatting...---\n 
 while(1){
 /* 把集合清空 */
 FD_ZERO(rfds);
 /* 把標準輸入句柄 0 加入到集合中 */
 FD_SET(0, rfds);
 maxfd = 0;
 /* 把當前連接句柄 socket  加入到集合中 */
 FD_SET(sockfd, rfds);
 if(sockfd   maxfd)
 maxfd = sockfd;
 /* 設置最大等待時間 */
 tv.tv_sec = 1;
 tv.tv_usec = 0;
 /* 開始等待 */
 retval = select(maxfd+1, rfds,NULL,NULL, tv);
 if(retval == -1){
 printf( select error,quit!\n 
 break;
 }else if(retval == 0){
 continue;
 }else{ if(FD_ISSET(sockfd, rfds)){
 /* 連接的 socket  上有消息則接收并顯示 */
 bzero(buffer,MAXBUF+1);
 /* 接收對方發過來的消息,最多 MAXBUF 字節 */
 len = recv(sockfd, buffer, MAXBUF, 0);
 if(len   0)
 printf(recv msg success:%s! %d bytes rcv.\n  ,buffer,len);
 else{ if(len   0){ printf( recv msg fail.the errno is:%d,error info is %s.\n ,errno,strerror(errno));
 }
 else
 printf( quit.\n 
 break;
 }
 }// FD_ISSET = sockfd 情況
 if(FD_ISSET(0, rfds)){
 /* 用戶有輸入了,則讀取其內容并發送 */
 bzero(buffer, MAXBUF+1);
 fgets(buffer, MAXBUF, stdin);
 if(!strncasecmp(buffer,  quit , 4)){
 printf( self request to quit the chating\n 
 break;
 }
 /* 發消息給服務器 */
 len = send(sockfd, buffer, strlen(buffer)-1 , 0);
 if(len   0){ printf( mgs:%s send fail!errno is:%d,error info is:%s\n , buffer, errno, strerror(errno));
 break;
 }else{ printf( msg: %s\t send success, send %d bytes!\n , buffer, len);
 }
 }//FD_ISSET = 0
 
 }//select  處理結束
 }// 處理聊天的 while  循環
 /* 關閉連接 */
 close(sockfd);
 return 0;
}

運行結果:

終端 1:服務器端

[root@localhost net]# ./select_server 7838
----waiting for new connecting to start new char----
server:got connection from 172.31.100.236,port 59462,socked 4
recv msg success:kfldsjfk! 8 bytes rcv.
456354
 msg: 456354
 send success, send 6 bytes!
recv msg success:453455! 6 bytes rcv.

終端 2:客戶端

[root@localhost net]# ./select_client 172.31.100.236 7838
---ready to chatting...---
kfldsjfk
msg: kfldsjfk
 send success, send 8 bytes!
recv msg success:456354! 6 bytes rcv.
453455
 msg: 453455
 send success, send 6 bytes!

以上就是關于“Linux 下 select 異步通訊怎么實現”這篇文章的內容,相信大家都有了一定的了解,希望丸趣 TV 小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注丸趣 TV 行業資訊頻道。

向 AI 問一下細節

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2024-02-04發表,共計5844字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 博兴县| 平江县| 广南县| 呼图壁县| 隆昌县| 奇台县| 酒泉市| 依兰县| 荔波县| 冷水江市| 桦川县| 明星| 峡江县| 大厂| 高青县| 鹤庆县| 新闻| 修水县| 晋宁县| 东源县| 赞皇县| 盐源县| 澳门| 泉州市| 玉田县| 肃宁县| 嵊泗县| 通化县| 铜鼓县| 武川县| 馆陶县| 隆安县| 武陟县| 鸡东县| 伽师县| 聂荣县| 来安县| 桦川县| 汶川县| 西盟| 中牟县|