国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

linux socket 編程(C語言)

2019-11-08 19:55:16
字體:
來源:轉載
供稿:網友

     最近看了一些網絡編程的書籍,一直以來總感覺網絡編程神秘莫測,其實網絡編程入門還是很容易學的,下面這些代碼是我在linux下編寫的,已經運行過了,編譯之后就可以運行了。有不足之處希望大家多多指出,共同學習交流。

     套接字是一種進程間的通信的方法,不同于以往介紹的進程間通信方法的是,它并不局限于同一臺計算機的資源,例如文件系統空間,共享內存或者消息隊列。套接字可以認為是對管道概念的擴展——一臺機器上的進程可以使用套接字與另一臺機器上的進程通信。因此客戶與服務器可以分散在網絡中。同一臺機器上的進程間也可以用套接字通信。套接字是一種通信機制,客戶/服務器系統既可以在本地單機上運行,也可以在網絡中運行。套接字與管道的區別:它明確區分客戶與服務器,可以實現將多個客戶連接到一個服務器。

     套接字的工作過程(服務器端):首先,服務器應用程序通過socket系統調用創建一個套接字,它是系統分配給該服務器進程的類似文件描述符的資源,不能與其他進程共享。其次,服務器進程使用bind系統調用給套接字命名。本地套接字的名字是linux文件系統的文件名,一般放在/tmp或者/usr/tmp 目錄下。網絡套接字的名字是與客戶相連接的特定網絡有關的服務標識符。此標識符允許linux將進入的針對特定端口號的連接轉到正確的服務器進程。接下來,服務器進程開始等待客戶連接到這個命名套接字,調用listen創建一個等待隊列以便存放來自客戶的進入連接。最后,服務器通過accept系統調用來接受客戶的連接。此時,會產生一個與原有的命名套接字不同的新套接字,它僅用于與這個特定的客戶通信,而命名套接字則被保留下來繼續處理來自其他客戶的連接。  

     套接字的工作過程(客戶端):調用socket創建一個未命名套接字,將服務器的命名套接字作為一個地址來調用connect與服務器建立連接。一旦建立了連接,就可以像使用底層文件描述符那樣來用套接字進行雙向的數據通信。 

TCP協議:

服務器端:tcp_server.c

[cpp] view plain copy#include <stdio.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <arpa/inet.h>    int main(int argc, char *argv[])  {      int server_sockfd;//服務器端套接字      int client_sockfd;//客戶端套接字      int len;      struct sockaddr_in my_addr;   //服務器網絡地址結構體      struct sockaddr_in remote_addr; //客戶端網絡地址結構體      int sin_size;      char buf[BUFSIZ];  //數據傳送的緩沖區      memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零      my_addr.sin_family=AF_INET; //設置為ip通信      my_addr.sin_addr.s_addr=INADDR_ANY;//服務器IP地址--允許連接到所有本地地址上      my_addr.sin_port=htons(8000); //服務器端口號            /*創建服務器端套接字--IPv4協議,面向連接通信,TCP協議*/      if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)      {            perror("socket");          return 1;      }             /*將套接字綁定到服務器的網絡地址上*/      if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)      {          perror("bind");          return 1;      }            /*監聽連接請求--監聽隊列長度為5*/      listen(server_sockfd,5);            sin_size=sizeof(struct sockaddr_in);            /*等待客戶端連接請求到達*/      if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)      {          perror("accept");          return 1;      }              printf("%s/n",buf);          if(send(client_sockfd,buf,len,0)<0)          {              perror("write");              return 1;          }      }      close(client_sockfd);      close(server_sockfd);          return 0;  }  

TCP協議:

客戶端:tcp_client.c

[c-sharp] view plain copy#include <stdio.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <arpa/inet.h>    int main(int argc, char *argv[])  {      int client_sockfd;      int len;      struct sockaddr_in remote_addr; //服務器端網絡地址結構體      char buf[BUFSIZ];  //數據傳送的緩沖區      memset(&remote_addr,0,sizeof(remote_addr)); //數據初始化--清零      remote_addr.sin_family=AF_INET; //設置為IP通信      remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服務器IP地址      remote_addr.sin_port=htons(8000); //服務器端口號            /*創建客戶端套接字--IPv4協議,面向連接通信,TCP協議*/      if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)      {          perror("socket");          return 1;      }            /*將套接字綁定到服務器的網絡地址上*/      if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)      {          perror("connect");          return 1;      }      printf("connected to server/n");      len=recv(client_sockfd,buf,BUFSIZ,0);//接收服務器端信息           buf[len]='/0';      printf("%s",buf); //打印服務器端信息            /*循環的發送接收信息并打印接收信息--recv返回接收到的字節數,send返回發送的字節數*/      while(1)      {          printf("Enter string to send:");          scanf("%s",buf);          if(!strcmp(buf,"quit")              break;          len=send(client_sockfd,buf,strlen(buf),0);          len=recv(client_sockfd,buf,BUFSIZ,0);          buf[len]='/0';          printf("received:%s/n",buf);      }      close(client_sockfd);//關閉套接字           return 0;  }  

UDP協議:

服務器端:udp_server.c

 

[cpp] view plain copy#include <stdio.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <arpa/inet.h>    int main(int argc, char *argv[])  {      int server_sockfd;      int len;      struct sockaddr_in my_addr;   //服務器網絡地址結構體           struct sockaddr_in remote_addr; //客戶端網絡地址結構體      int sin_size;      char buf[BUFSIZ];  //數據傳送的緩沖區      memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零      my_addr.sin_family=AF_INET; //設置為IP通信      my_addr.sin_addr.s_addr=INADDR_ANY;//服務器IP地址--允許連接到所有本地地址上      my_addr.sin_port=htons(8000); //服務器端口號            /*創建服務器端套接字--IPv4協議,面向無連接通信,UDP協議*/      if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)      {            perror("socket");          return 1;      }             /*將套接字綁定到服務器的網絡地址上*/      if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)      {          perror("bind");          return 1;      }      sin_size=sizeof(struct sockaddr_in);      printf("waiting for a packet.../n");            /*接收客戶端的數據并將其發送給客戶端--recvfrom是無連接的*/      if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)      {          perror("recvfrom");           return 1;      }      printf("received packet from %s:/n",inet_ntoa(remote_addr.sin_addr));      buf[len]='/0';      printf("contents: %s/n",buf);      close(server_sockfd);          return 0;  }  

 

客戶端:udp_client.c

[cpp] view plain copy#include <stdio.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <arpa/inet.h>    int main(int argc, char *argv[])  {      int client_sockfd;      int len;          struct sockaddr_in remote_addr; //服務器端網絡地址結構體      int sin_size;      char buf[BUFSIZ];  //數據傳送的緩沖區      memset(&remote_addr,0,sizeof(remote_addr)); //數據初始化--清零      remote_addr.sin_family=AF_INET; //設置為IP通信      remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服務器IP地址      remote_addr.sin_port=htons(8000); //服務器端口號             /*創建客戶端套接字--IPv4協議,面向無連接通信,UDP協議*/      if((client_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)      {            perror("socket");          return 1;      }      strcpy(buf,"This is a test message");      printf("sending: '%s'/n",buf);      sin_size=sizeof(struct sockaddr_in);            /*向服務器發送數據包*/      if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0)      {          perror("recvfrom");           return 1;      }      close(client_sockfd);      return 0;  }    

 

socket函數API.cpp

htons();//將short類型的值從主機字節序轉換為網絡字節序inet_addr();//將IP地址字符串轉換為long類型的網絡字節序gethostbyname();//獲得與該域名對應的IP地址inet_ntoa();//將long類型的網絡字節序轉換成IP地址字符串


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台南市| 四子王旗| 老河口市| 潍坊市| 莱西市| 林州市| 武冈市| 昭平县| 安西县| 通州区| 襄垣县| 鄂托克前旗| 荃湾区| 黄平县| 祁阳县| 郯城县| 华亭县| 遵义市| 措勤县| 吉安县| 共和县| 长沙县| 资阳市| 历史| 浦江县| 屯昌县| 定边县| 大安市| 郑州市| 沙洋县| 晋城| 深水埗区| 凌海市| 托克托县| 韶关市| 新巴尔虎右旗| 巧家县| 阿克陶县| 重庆市| 长白| 大同市|