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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux网络编程(三)

發布時間:2024/3/13 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络编程(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

IO非阻塞操作

????????? sock的方法不一定非得是阻塞的,也可以非阻塞的操作。有兩種方法分別為設置fcntl 和設置相應函數的參數。

?

??? 服務端:

[cpp] view plain copy print ?
  • #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(&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?*)&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?*)&client_address,?(socklen_t?*)&client_len);??
  • ??
  • ????for(i=0;i<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?>?0){??
  • ????????????printf(”get?%d?message:%s”,?byte,?char_send);??
  • ????????????byte=0;??
  • ????????}else?if(byte<0){??
  • ????????????if(errno==EAGAIN){??
  • ????????????????errno=0;??
  • ????????????????continue;??
  • ????????????}else{??
  • ????????????????perror(”recv”);??
  • ????????????????exit(EXIT_FAILURE);??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????shutdown(client_sockfd,2);??
  • ????shutdown(server_sockfd,2);??
  • }??
  • #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); }


    ??????? 客戶端:

    [cpp] view plain copy print ?
  • #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))?<?0)?{??
  • ????????perror(”Socket”);??
  • ????????exit(EXIT_FAILURE);??
  • ????}??
  • ??
  • ????bzero(&dest,?sizeof(dest));??
  • ????dest.sin_family?=?AF_INET;??
  • ????dest.sin_port?=?htons(7838);??
  • ????if(argc<2){??
  • ????????printf(”Usage:?%s?<dest?ip>?<src?ip>”,argv[0]);??
  • ????????exit(1);??
  • ????}??
  • ????if?(inet_aton(argv[1],?(struct?in_addr?)?&dest.sin_addr.s_addr)?==?0){??
  • ????????perror(argv[1]);??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????bzero(&mine,?sizeof(mine));??
  • ????mine.sin_family?=?AF_INET;??
  • ????mine.sin_port?=?htons(7839);??
  • ????if?(inet_aton(argv[2],?(struct?in_addr?)?&mine.sin_addr.s_addr)?==?0){??
  • ????????perror(argv[2]);??
  • ????????exit(EXIT_FAILURE);??
  • ????}??
  • ????if?(bind(sockfd,?(struct?sockaddr?)?&mine,?sizeof(struct?sockaddr))?==?-1){??
  • ????????perror(argv[3]);??
  • ????????exit(EXIT_FAILURE);??
  • ????}??
  • ????printf(”will?connect!\n”);??
  • ????if?(connect(sockfd,?(struct?sockaddr?*)?&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?>?0){??
  • ????????????printf(”get?%d?message:%s”,?ret,?buffer);??
  • ????????????ret=0;??
  • ????????}else?if(ret?<?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;??
  • }??
  • #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.csdn.net/fansongy/article/details/6898577

    ?

    總結

    以上是生活随笔為你收集整理的Linux网络编程(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。