溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

unix socket網(wǎng)絡編程TCP簡單例子

發(fā)布時間:2020-03-03 03:53:12 來源:網(wǎng)絡 閱讀:1592 作者:xieyihua 欄目:系統(tǒng)運維

 

  1. server.c 
  2.  
  3. #include <sys/types.h>         
  4. #include <sys/socket.h> 
  5. #include <stdio.h> 
  6. #include <stdlib.h> 
  7. #include <string.h> 
  8. #include <arpa/inet.h> 
  9. #include <stdio.h> 
  10. #include <unistd.h> 
  11.  
  12.  
  13.  
  14.  
  15. int main(int argc, char** argv) 
  16.     int ret; 
  17.      
  18. //創(chuàng)建socket文件 
  19.     int sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  20.     if(sockfd == -1) 
  21.     { 
  22.         perror("socket\n"); 
  23.         exit(1); 
  24.     } 
  25.     printf("socket_fd = %d\n",sockfd); 
  26.      
  27. //重復使用本地址與socket文件進行綁定,如果不設置系統(tǒng),會保留此連接直到最后一引用才釋放,即進程結束后系統(tǒng)需要幾分鐘后才能重新進行綁定 
  28.     int i = 1
  29.     ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); 
  30.     if(ret) 
  31.     { 
  32.         perror("setsockopt\n"); 
  33.         exit(1);     
  34.     } 
  35.     printf("setsockopt complete!\n"); 
  36. //創(chuàng)建服務器socket地址sock_addr 
  37.     struct sockaddr_in server_addr; 
  38.     server_addr.sin_family = AF_INET
  39.     server_addr.sin_port = htons(4444); 
  40.     //地址指定INADDR_ANY表示可以接收安裝在系統(tǒng)里面所有網(wǎng)卡的數(shù)據(jù)包 
  41.     server_addr.sin_addr.s_addr = INADDR_ANY
  42.     memset(server_addr.sin_zero, 8, 8); 
  43.      
  44. //將socket與地址進行綁定,這樣可以使所有發(fā)向端口4444及協(xié)議為IPV4數(shù)據(jù)包指向socket文件 
  45.     ret =  bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)); 
  46.     if(ret) 
  47.     { 
  48.         perror("bind\n"); 
  49.         exit(1);     
  50.     } 
  51.     printf("bind complete!\n"); 
  52.      
  53. //監(jiān)聽連接到該socket上請求,不會發(fā)生阻塞行為,以下設置隊列大小為1,即隊列滿的時候其它連接會被拒絕連接 
  54.     ret = listen(sockfd, 10); 
  55.     if(ret) 
  56.     { 
  57.         perror("listen\n"); 
  58.         exit(1);     
  59.     } 
  60.     printf("listen complete!\n"); 
  61.      
  62. //接收連接請求并建立連接, 如果沒有連接請求 accept會一址阻塞,直到有請求來 
  63.     struct sockaddr_in client_addr; 
  64.     int client_fd; 
  65.     socklen_t len = sizeof(struct sockaddr); 
  66.     client_fd = accept(sockfd, (struct sockaddr*)&client_addr, &len); 
  67.     if(client_fd == -1) 
  68.     { 
  69.         perror("bind\n"); 
  70.         exit(1);     
  71.     } 
  72.     printf("accept complete!\n"); 
  73.      
  74. //請取client發(fā)來的信息 
  75.  
  76.     char buf[100]; 
  77.     ssize_t readnum; 
  78.     memset(buf,100,0);
  79.  
  80. //這里應該是客戶端的socket文件描述符 
  81.     readnum = recv(client_fd, (void*)buf, 100, MSG_WAITALL); 
  82.     //清空標準輸出 
  83.     fflush(stdout); 
  84.     printf("received:%s\nnumber byte:%d\n",buf,strlen(buf)); 
  85.      
  86.      
  87. //發(fā)送信息到用戶端 
  88.  
  89.     ssize_t sendnum; 
  90.     char content[100]="\"server:received the data!\""; 
  91.     sendsendnum = send(client_fd, content, 100, 0); 
  92.     printf("reply:%s\nnumber byte:%d\n",content,sendnum); 
  93.      
  94. // 關閉socket文件    
  95.     close(sockfd); 
  96.     close(client_fd); 
  97.      
  98.     return 0; 
  99.  
  100.  
  101.  
  102. client.c 
  103.  
  104. #include <sys/types.h>         
  105. #include <sys/socket.h> 
  106. #include <stdio.h> 
  107. #include <stdlib.h> 
  108. #include <string.h> 
  109. #include <arpa/inet.h> 
  110. #include <stdio.h> 
  111. #include <unistd.h> 
  112. #include <arpa/inet.h> 
  113.  
  114.  
  115.  
  116.  
  117.  
  118. int main(int argc, char** argv) 
  119.     int ret; 
  120.      
  121. //創(chuàng)建socket文件 
  122.     int sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  123.     if(sockfd == -1) 
  124.     { 
  125.         perror("socket\n"); 
  126.         exit(1); 
  127.     } 
  128.     printf("socket_fd = %d\n",sockfd); 
  129.      
  130. //創(chuàng)建服務器socket地址sock_addr 
  131.     struct sockaddr_in server_addr; 
  132.     server_addr.sin_family = AF_INET
  133.     server_addr.sin_port = htons(4444); 
  134.     //將字符串地址轉換成網(wǎng)絡地址,有兩種方法 
  135.     inet_pton(AF_INET, "127.0.0.1", (void*)&server_addr.sin_addr.s_addr);//IPV4 IPV6可用 
  136.     //server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//只能轉IPV4 
  137.     memset(server_addr.sin_zero, 8, 0); 
  138.  
  139. //連接服務端 
  140.     ret = connect(sockfd, (struct sockaddr*)&server_addr,sizeof(struct sockaddr)); 
  141.     if(ret == -1) 
  142.     { 
  143.         perror("connect\n"); 
  144.         exit(1);         
  145.     } 
  146.     printf("connect complete!\n"); 
  147.      
  148. //發(fā)送信息 
  149.     char content[100] = "\"hello,i am client!\""; 
  150.     ssize_t sendsendnum = send(sockfd, content, strlen(content)+1, 0); 
  151.     printf("send complete\nnumber byte:%d\ncontent:%s\n",sendnum,content); 
  152.      
  153. //收信息 
  154.     char buf[100]; 
  155.     ssize_t readnum; 
  156.     memset(buf,100,0); 
  157.     readnum = recv(sockfd, (void*)buf, 100, MSG_WAITALL); 
  158.     //清空標準輸出 
  159.     fflush(stdout); 
  160.     printf("received:%s\nnumber byte:%d\n",buf,strlen(buf)); 
  161.      
  162. //關閉socket 
  163.     close(sockfd); 
  164.     return 0; 

 

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI