Linux网络编程(三)

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. }  
#include <sys/socket.h>




include <stdio.h>

include <string.h>

include <netinet/in.h>

include <arpa/inet.h>

include <unistd.h>

include <stdlib.h>

include <errno.h>

define BUFSIZE 128

int main(int argc,char *argv[]){
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
int i,byte;
char char_send[BUFSIZE];

server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

bzero(&amp;server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(7838);
server_address.sin_addr.s_addr = INADDR_ANY;
server_len = sizeof(server_address);

if ((bind(server_sockfd, (struct sockaddr *)&amp;server_address, server_len))== -1) {
    perror("bind");
    exit(EXIT_FAILURE);
}

listen(server_sockfd, 5);

printf("server waiting for connect\n");

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&amp;client_address, (socklen_t *)&amp;client_len);

for(i=0;i&lt;5;i++){
    memset(char_send,'\0',BUFSIZE);
    printf("input message to send:");
    fgets(char_send,BUFSIZE,stdin);
    if((byte=send(client_sockfd,char_send,strlen(char_send),0))==-1){
        perror("send");
        exit(EXIT_FAILURE);
    }

    memset(char_send,'\0',BUFSIZE);
    //最后一个参数为非阻塞的设置
    byte = recv(client_sockfd, char_send, BUFSIZE,MSG_DONTWAIT);
    if(byte &gt; 0){
        printf("get %d message:%s", byte, char_send);
        byte=0;
    }else if(byte&lt;0){
        if(errno==EAGAIN){
            errno=0;
            continue;
        }else{
            perror("recv");
            exit(EXIT_FAILURE);
        }
    }
}
shutdown(client_sockfd,2);
shutdown(server_sockfd,2);
}


        客户端:

  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. }  
#include <stdio.h>

include <string.h>

include <errno.h>

include <sys/socket.h>

include <resolv.h>

include <stdlib.h>

include <netinet/in.h>

include <arpa/inet.h>

include <unistd.h>

include <fcntl.h>

define MAXBUF 128

int main(int argc, char **argv){
int sockfd, ret, i;
struct sockaddr_in dest, mine;
char buffer[MAXBUF + 1];

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0) {
    perror("Socket");
    exit(EXIT_FAILURE);
}

bzero(&amp;dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(7838);
if(argc&lt;2){
    printf("Usage: %s &lt;dest ip&gt; &lt;src ip&gt;",argv[0]);
    exit(1);
}
if (inet_aton(argv[1], (struct in_addr *) &amp;dest.sin_addr.s_addr) == 0){
    perror(argv[1]);
    exit(1);
}

bzero(&amp;mine, sizeof(mine));
mine.sin_family = AF_INET;
mine.sin_port = htons(7839);
if (inet_aton(argv[2], (struct in_addr *) &amp;mine.sin_addr.s_addr) == 0){
    perror(argv[2]);
    exit(EXIT_FAILURE);
}
if (bind(sockfd, (struct sockaddr *) &amp;mine, sizeof(struct sockaddr)) == -1){
    perror(argv[3]);
    exit(EXIT_FAILURE);
}
printf("will connect!\n");
if (connect(sockfd, (struct sockaddr *) &amp;dest, sizeof(dest)) != 0) {
    perror("Connect ");
    exit(EXIT_FAILURE);
}
//设置sock连接的非阻塞
if(fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) {
    perror("fcntl");
    exit(EXIT_FAILURE);
}

while(1){
    bzero(buffer, MAXBUF + 1);
    //因为在socket中设置过,所以就不用再设置了
    ret = recv(sockfd, buffer, MAXBUF, 0);
    if(ret &gt; 0){
        printf("get %d message:%s", ret, buffer);
        ret=0;
    }else if(ret &lt; 0) {
        if(errno == EAGAIN) {
            errno=0;
            continue;
        }else{
            perror("recv");
            exit(EXIT_FAILURE);
        }
    }

    memset( buffer,'\0',MAXBUF+1);
    printf("input message to send:");
    fgets( buffer,MAXBUF,stdin);
    if((ret=send(sockfd,buffer,strlen(buffer),0))==-1){
        perror("send");
        exit(EXIT_FAILURE);
    }

}
close(sockfd);
return 0;
}


 

 

     本篇博客出自  阿修罗道,转载出处:http://blog.youkuaiyun.com/fansongy/article/details/6898577

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值