Chinaunix首页 | 论坛 | 博客
  • 博客访问: 241191
  • 博文数量: 76
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-20 14:21
文章分类

全部博文(76)

文章存档

2015年(76)

我的朋友

分类: 其他平台

2015-08-10 17:17:21

IO非阻塞操作

          sock的方法不一定非得是阻塞的,也可以非阻塞的操作。有两种方法分别为设置fcntl 和设置相应函数的参数。

 

    服务端:

  1. #include <sys/socket.h>  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <netinet/in.h>  
  5. #include <arpa/inet.h>  
  6. #include <unistd.h>  
  7. #include <stdlib.h>  
  8. #include <errno.h>  
  9.   
  10. #define  BUFSIZE 128  
  11.   
  12. int main(int argc,char *argv[]){  
  13.     int server_sockfd, client_sockfd;  
  14.     int server_len, client_len;  
  15.     struct sockaddr_in server_address;  
  16.     struct sockaddr_in client_address;  
  17.     int i,byte;  
  18.     char char_send[BUFSIZE];  
  19.   
  20.     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);  
  21.   
  22.     bzero(&server_address, sizeof(server_address));  
  23.     server_address.sin_family = AF_INET;  
  24.     server_address.sin_port = htons(7838);  
  25.     server_address.sin_addr.s_addr = INADDR_ANY;  
  26.     server_len = sizeof(server_address);  
  27.   
  28.     if ((bind(server_sockfd, (struct sockaddr *)&server_address, server_len))== -1) {  
  29.         perror("bind");  
  30.         exit(EXIT_FAILURE);  
  31.     }  
  32.   
  33.     listen(server_sockfd, 5);  
  34.   
  35.     printf("server waiting for connect\n");  
  36.   
  37.     client_len = sizeof(client_address);  
  38.     client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, (socklen_t *)&client_len);  
  39.   
  40.     for(i=0;i<5;i++){  
  41.         memset(char_send,'\0',BUFSIZE);  
  42.         printf("input message to send:");  
  43.         fgets(char_send,BUFSIZE,stdin);  
  44.         if((byte=send(client_sockfd,char_send,strlen(char_send),0))==-1){  
  45.             perror("send");  
  46.             exit(EXIT_FAILURE);  
  47.         }  
  48.   
  49.         memset(char_send,'\0',BUFSIZE);  
  50.         //最后一个参数为非阻塞的设置  
  51.         byte = recv(client_sockfd, char_send, BUFSIZE,MSG_DONTWAIT);  
  52.         if(byte > 0){  
  53.             printf("get %d message:%s", byte, char_send);  
  54.             byte=0;  
  55.         }else if(byte<0){  
  56.             if(errno==EAGAIN){  
  57.                 errno=0;  
  58.                 continue;  
  59.             }else{  
  60.                 perror("recv");  
  61.                 exit(EXIT_FAILURE);  
  62.             }  
  63.         }  
  64.     }  
  65.     shutdown(client_sockfd,2);  
  66.     shutdown(server_sockfd,2);  
  67. }  


        客户端:

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <errno.h>  
  4. #include <sys/socket.h>  
  5. #include <resolv.h>  
  6. #include <stdlib.h>  
  7. #include <netinet/in.h>  
  8. #include <arpa/inet.h>  
  9. #include <unistd.h>  
  10. #include <fcntl.h>  
  11.   
  12. #define MAXBUF 128  
  13.   
  14. int main(int argc, char **argv){  
  15.     int sockfd, ret, i;  
  16.     struct sockaddr_in dest, mine;  
  17.     char buffer[MAXBUF + 1];  
  18.   
  19.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  
  20.         perror("Socket");  
  21.         exit(EXIT_FAILURE);  
  22.     }  
  23.   
  24.     bzero(&dest, sizeof(dest));  
  25.     dest.sin_family = AF_INET;  
  26.     dest.sin_port = htons(7838);  
  27.     if(argc<2){  
  28.         printf("Usage: %s <dest ip> <src ip>",argv[0]);  
  29.         exit(1);  
  30.     }  
  31.     if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0){  
  32.         perror(argv[1]);  
  33.         exit(1);  
  34.     }  
  35.   
  36.     bzero(&mine, sizeof(mine));  
  37.     mine.sin_family = AF_INET;  
  38.     mine.sin_port = htons(7839);  
  39.     if (inet_aton(argv[2], (struct in_addr *) &mine.sin_addr.s_addr) == 0){  
  40.         perror(argv[2]);  
  41.         exit(EXIT_FAILURE);  
  42.     }  
  43.     if (bind(sockfd, (struct sockaddr *) &mine, sizeof(struct sockaddr)) == -1){  
  44.         perror(argv[3]);  
  45.         exit(EXIT_FAILURE);  
  46.     }  
  47.     printf("will connect!\n");  
  48.     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {  
  49.         perror("Connect ");  
  50.         exit(EXIT_FAILURE);  
  51.     }  
  52.     //设置sock连接的非阻塞  
  53.     if(fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) {  
  54.         perror("fcntl");  
  55.         exit(EXIT_FAILURE);  
  56.     }  
  57.   
  58.     while(1){  
  59.         bzero(buffer, MAXBUF + 1);  
  60.         //因为在socket中设置过,所以就不用再设置了  
  61.         ret = recv(sockfd, buffer, MAXBUF, 0);  
  62.         if(ret > 0){  
  63.             printf("get %d message:%s", ret, buffer);  
  64.             ret=0;  
  65.         }else if(ret < 0) {  
  66.             if(errno == EAGAIN) {  
  67.                 errno=0;  
  68.                 continue;  
  69.             }else{  
  70.                 perror("recv");  
  71.                 exit(EXIT_FAILURE);  
  72.             }  
  73.         }  
  74.   
  75.         memset( buffer,'\0',MAXBUF+1);  
  76.         printf("input message to send:");  
  77.         fgets( buffer,MAXBUF,stdin);  
  78.         if((ret=send(sockfd,buffer,strlen(buffer),0))==-1){  
  79.             perror("send");  
  80.             exit(EXIT_FAILURE);  
  81.         }  
  82.   
  83.     }  
  84.     close(sockfd);  
  85.     return 0;  
  86. }  
阅读(1287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~