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 }

 

 

 

posted @ 2020-02-12 19:14  cnwanglu  阅读(1191)  评论(0编辑  收藏  举报