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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux网络编程(四)

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

?

????TCP雖然可以實現?IO非阻塞操作,但在實際應用時會對資源是否準備完畢進行循環測試,增加了不必要的CPU占用。

?

??? 為了解決這種問題,應用多路復用的知識,select()監聽信號。相關知識可以參考 linux文件讀寫 文件鎖 select poll

?

???????? 服務端:

?

[cpp] view plain copy print ?
  • #include?<sys/types.h>??
  • #include?<sys/socket.h>??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<string.h>??
  • #include?<sys/time.h>??
  • #include?<sys/ioctl.h>??
  • #include?<unistd.h>??
  • #include?<netinet/in.h>??
  • ??
  • #define?PORT????????????????4321??
  • #define?MAX_QUE_CONN_NM?????????5??
  • #define?MAX_SOCK_FD?????????FD_SETSIZE??
  • #define?BUFFER_SIZE?????????1024??
  • ??
  • int?main(){??
  • ????struct?sockaddr_in?server_sockaddr,?client_sockaddr;??
  • ????int?sin_size,?count;??
  • ????fd_set?inset,?tmp_inset;??
  • ????int?sockfd,?client_fd,?fd;??
  • ????char?buf[BUFFER_SIZE];??
  • ??
  • ????if?((sockfd?=?socket(AF_INET,?SOCK_STREAM,?0))?==?-1){??
  • ????????perror(”socket”);??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????server_sockaddr.sin_family?=?AF_INET;??
  • ????server_sockaddr.sin_port?=?htons(PORT);??
  • ????server_sockaddr.sin_addr.s_addr?=?INADDR_ANY;??
  • ????bzero(&(server_sockaddr.sin_zero),?8);??
  • ??
  • ????int?i?=?1;??
  • ????//設置socket的屬性??
  • ????setsockopt(sockfd,?SOL_SOCKET,?SO_REUSEADDR,?&i,?sizeof(i));??
  • ????if?(bind(sockfd,?(struct?sockaddr?*)&server_sockaddr,?sizeof(struct?sockaddr))?==?-1){??
  • ????????perror(”bind”);??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????if(listen(sockfd,?MAX_QUE_CONN_NM)?==?-1){??
  • ????????perror(”listen”);??
  • ????????exit(1);??
  • ????}??
  • ????printf(”listening….\n”);??
  • ????//清空select集合??
  • ????FD_ZERO(&inset);??
  • ???//將要檢測的文件符加入??
  • ???FD_SET(sockfd,?&inset);??
  • ??
  • ????while(1){??
  • ????????tmp_inset?=?inset;???????
  • ????????sin_size=sizeof(struct?sockaddr_in);??
  • ????????memset(buf,?0,?sizeof(buf));??
  • ????????printf(”run?while…\n”);??
  • ????????//程序在此阻塞,select返回一個文件符,并將其他文件符清空??
  • ????????if?(!(select(MAX_SOCK_FD,?&tmp_inset,?NULL,?NULL,?NULL)?>?0)){????
  • ????????????perror(”select”);??
  • ????????????close(sockfd);??
  • ????????????exit(1);??
  • ????????}??
  • ????????printf(”run?for…\n”);??
  • ????????for?(fd?=?0;?fd?<?MAX_SOCK_FD;?fd++){??
  • ????????????if?(FD_ISSET(fd,?&tmp_inset)?>?0)?{??
  • ????????????????printf(”fd?is?%d?,socket?is?%d\n”,fd,sockfd);??
  • ????????????????if?(fd?==?sockfd){???????????
  • ????????????????????if?((client_fd?=?accept(sockfd,?(struct?sockaddr?*)&client_sockaddr,?&sin_size))==?-1){??
  • ????????????????????????perror(”accept”);??
  • ????????????????????????exit(1);??
  • ????????????????????}??
  • ??
  • ????????????????????FD_SET(client_fd,?&inset);??
  • ????????????????????printf(”New?connection?from?%d(socket)\n”,?client_fd);??
  • ????????????????}else{??
  • ????????????????????if?((count?=?recv(fd,?buf,?BUFFER_SIZE,?0))?>?0){??
  • ????????????????????????printf(”Received?a?message?from?%d:?%s\n”,?fd,?buf);??
  • ????????????????????}else{??
  • ????????????????????????close(fd);??
  • ????????????????????????FD_CLR(fd,?&inset);??
  • ????????????????????????printf(”Client?%d(socket)?has?left\n”,?fd);??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}?/*?end?of?if?FD_ISSET*/??
  • ????????}?/*?end?of?for?fd*/??
  • ????}?/*?end?if?while?while*/??
  • ??
  • ????close(sockfd);??
  • ????exit(0);??
  • }??
  • #include <sys/types.h>

    include <sys/socket.h>

    include <stdio.h>

    include <stdlib.h>

    include <string.h>

    include <sys/time.h>

    include <sys/ioctl.h>

    include <unistd.h>

    include <netinet/in.h>

    define PORT 4321

    define MAX_QUE_CONN_NM 5

    define MAX_SOCK_FD FD_SETSIZE

    define BUFFER_SIZE 1024

    int main(){
    struct sockaddr_in server_sockaddr, client_sockaddr;
    int sin_size, count;
    fd_set inset, tmp_inset;
    int sockfd, client_fd, fd;
    char buf[BUFFER_SIZE];

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");exit(1); }server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(PORT); server_sockaddr.sin_addr.s_addr = INADDR_ANY; bzero(&amp;(server_sockaddr.sin_zero), 8);int i = 1; //設置socket的屬性 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &amp;i, sizeof(i)); if (bind(sockfd, (struct sockaddr *)&amp;server_sockaddr, sizeof(struct sockaddr)) == -1){perror("bind");exit(1); }if(listen(sockfd, MAX_QUE_CONN_NM) == -1){perror("listen");exit(1); } printf("listening....\n"); //清空select集合 FD_ZERO(&amp;inset); //將要檢測的文件符加入 FD_SET(sockfd, &inset); while(1){tmp_inset = inset; sin_size=sizeof(struct sockaddr_in);memset(buf, 0, sizeof(buf));printf("run while...\n");//程序在此阻塞,select返回一個文件符,并將其他文件符清空if (!(select(MAX_SOCK_FD, &amp;tmp_inset, NULL, NULL, NULL) &gt; 0)){ perror("select");close(sockfd);exit(1);}printf("run for...\n");for (fd = 0; fd &lt; MAX_SOCK_FD; fd++){if (FD_ISSET(fd, &amp;tmp_inset) &gt; 0) {printf("fd is %d ,socket is %d\n",fd,sockfd);if (fd == sockfd){ if ((client_fd = accept(sockfd, (struct sockaddr *)&amp;client_sockaddr, &amp;sin_size))== -1){perror("accept");exit(1);}FD_SET(client_fd, &amp;inset);printf("New connection from %d(socket)\n", client_fd);}else{if ((count = recv(fd, buf, BUFFER_SIZE, 0)) &gt; 0){printf("Received a message from %d: %s\n", fd, buf);}else{close(fd);FD_CLR(fd, &amp;inset);printf("Client %d(socket) has left\n", fd);}}} /* end of if FD_ISSET*/} /* end of for fd*/ } /* end if while while*/close(sockfd); exit(0); }


    ?

    ???? 客戶端:

    ?

    [cpp] view plain copy print ?
  • <span?style=“font-size:18px;”>#include?<sys/types.h>??
  • #include?<sys/socket.h>??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<string.h>??
  • #include?<sys/ioctl.h>??
  • #include?<unistd.h>??
  • #include?<netdb.h>??
  • #include?<netinet/in.h>??
  • ??
  • #define?PORT????4321??
  • #define?BUFFER_SIZE?1024??
  • ??
  • int?main(int?argc,?char?*argv[]){??
  • ????int?sockfd,?sendbytes;??
  • ????char?buf[BUFFER_SIZE];??
  • ????struct?hostent?*host;??
  • ????struct?sockaddr_in?serv_addr;??
  • ??
  • ????if(argc?<?3){??
  • ????????fprintf(stderr,”USAGE:?./client?Hostname(or?ip?address)?Text\n”);??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????if?((host?=?gethostbyname(argv[1]))?==?NULL){??
  • ????????perror(”gethostbyname”);??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????memset(buf,?0,?sizeof(buf));??
  • ????sprintf(buf,?”%s”,?argv[2]);??
  • ??
  • ????if?((sockfd?=?socket(AF_INET,SOCK_STREAM,0))?==?-1){??
  • ????????perror(”socket”);??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????serv_addr.sin_family?=?AF_INET;??
  • ????serv_addr.sin_port?=?htons(PORT);??
  • ????serv_addr.sin_addr?=?*((struct?in_addr?*)host->h_addr);??
  • ????bzero(&(serv_addr.sin_zero),?8);??
  • ??
  • ????if(connect(sockfd,(struct?sockaddr?*)&serv_addr,?sizeof(struct?sockaddr))==?-1){??
  • ????????perror(”connect”);??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????if?((sendbytes?=?send(sockfd,?buf,?strlen(buf),?0))?==?-1){??
  • ????????perror(”send”);??
  • ????????exit(1);??
  • ????}??
  • ????sleep(30);??
  • ????close(sockfd);??
  • ????exit(0);??
  • }??
  • </span>??
  • #include <sys/types.h>

    include <sys/socket.h>

    include <stdio.h>

    include <stdlib.h>

    include <string.h>

    include <sys/ioctl.h>

    include <unistd.h>

    include <netdb.h>

    include <netinet/in.h>

    define PORT 4321

    define BUFFER_SIZE 1024

    int main(int argc, char *argv[]){
    int sockfd, sendbytes;
    char buf[BUFFER_SIZE];
    struct hostent *host;
    struct sockaddr_in serv_addr;

    if(argc &lt; 3){fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");exit(1); }if ((host = gethostbyname(argv[1])) == NULL){perror("gethostbyname");exit(1); }memset(buf, 0, sizeof(buf)); sprintf(buf, "%s", argv[2]);if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket");exit(1); }serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr = *((struct in_addr *)host-&gt;h_addr); bzero(&amp;(serv_addr.sin_zero), 8);if(connect(sockfd,(struct sockaddr *)&amp;serv_addr, sizeof(struct sockaddr))== -1){perror("connect");exit(1); }if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1){perror("send");exit(1); } sleep(30); close(sockfd); exit(0);

    }


    ?

    ?

    ?

    本篇博客出自? 阿修羅道,轉載出處:http://blog.csdn.net/fansongy/article/details/6901322

    總結

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

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