socket編程——C實現服務端與客戶端間通信實現大小寫轉換


編譯環境:VIM (Ubuntu 16.04)

------------------------------------------------------------------------------------------
更新:1)程序加上了對錯誤的處理
------------------------------------------------------------------------------------------

常用函數筆記:Socket編程——常用函數

程序包括服務端(server.c)和客戶端(client.c),客戶端實現從shell中輸入小寫字母,通過socket也就是套接字將數據發給服務端,服務端實現小寫->大寫,再將轉換好的數據發回客戶端。、

執行順序:server ----> client
結束順序:client  ----> server

如果先終止server的話會導致server綁定的端口不能及時被釋放,下次再執行server的時候可能會報錯。

 

server.c
——

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <sys/socket.h>
 4 #include <stdlib.h>
 5 #include <arpa/inet.h>
 6 #include <ctype.h>
 7 #include <string.h>
 8 
 9 #define SERV_IP "127.0.0.1"
10 #define SERV_PORT 6666
11 
12 int main()
13 {
14     int lfd,cfd;
15     struct sockaddr_in serv_addr, clie_addr;
16     socklen_t clie_addr_len;
17     char buf[BUFSIZ], clie_IP[BUFSIZ];
18     int n, i, ret;
19 
20     lfd = socket(AF_INET, SOCK_STREAM, 0);//IPV4,TCP
21     if(lfd == -1){
22         perror("socket error");
23         exit(1);
24     } 
25     serv_addr.sin_family = AF_INET;//IPV4 與socket()的參數相同
26     serv_addr.sin_port = htons(SERV_PORT);//本地字節序(小端)->網絡字節序(大端)
27     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY:本地任意IP(點分十進制類型)
28 
29     ret = bind(lfd ,(struct sockaddr *)&serv_addr, sizeof(serv_addr)); //綁定
30     if(ret == -1){
31         perror("bind error");
32         exit(1);
33     } 
34     ret = listen(lfd, 128);//設定最大同時連接數,default:128 
35     if(ret == -1){
36         perror("listen error");
37         exit(1);
38     } 
39     clie_addr_len = sizeof(clie_addr);
40     cfd = accept(lfd,(struct sockaddr *)&clie_addr, &clie_addr_len);//accept():接收一個連接
41     if(cfd == -1){
42         perror("accept error");
43         exit(1);
44     } 
45     printf("client IP:%s, client Port:%d\n", 
46             inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)),ntohs(clie_addr.sin_port));
47     while(1)
48     {
49         memset(buf,0,sizeof(buf));
50         n = read(cfd, buf, sizeof(buf)); //服務器程序阻塞在這,從客戶端讀取
51         if(strcmp(buf, "q\n") == 0) break;
52         for(i = 0; i < n; i++)
53             buf[i] = toupper(buf[i]);    //小寫 -> 大寫
54         write(cfd, buf, n);              //寫回客戶端
55     }
56     close(lfd);
57     close(cfd);
58 
59     return 0;
60 }

 

client.c
——

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <sys/socket.h>
 5 #include <arpa/inet.h>
 6 #include <string.h>
 7 
 8 #define SERV_IP "127.0.0.1"
 9 #define SERV_PORT 6666
10 int main()
11 {
12     int cfd, n, ret;
13     struct sockaddr_in serv_addr;
14     char buf[BUFSIZ];
15     cfd = socket(AF_INET, SOCK_STREAM, 0);
16     if(cfd == -1){
17         perror("socket error");
18         exit(1);
19     }    
20     memset(&serv_addr,0,sizeof(serv_addr));
21     serv_addr.sin_family = AF_INET;
22     serv_addr.sin_port = htons(SERV_PORT);
23     inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr); //字符串"127.0.0.1" ---> 網絡端格式
24 
25     ret = connect(cfd, (struct sockaddr *)&serv_addr, (socklen_t)sizeof(serv_addr)); //連接
26     if(ret == -1){
27         perror("socket error");
28         exit(1);
29     }    
30 
31     while(1)
32     {
33      fgets(buf,sizeof(buf),stdin); //hello world -- fgets  --->"hello world\n\0"
34      write(cfd,buf,strlen(buf));
35      n = read(cfd,buf,sizeof(buf));      
36      write(STDOUT_FILENO,buf,n);
37     }
38     close(cfd);
39     return 0;
40 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM