• 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
    ", 
    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
    ") == 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
    "
    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 }

  • 相关阅读:
    排序算法
    chrome
    2017年末思考
    phpstorm修改创建文件时的默认注释
    男人
    Easyui-Tree和Combotree使用注意事项-sunziren
    Easyui-Treegrid使用注意事项-sunziren
    在生产环境中碰见的JSP木马-sunziren
    JS实现粒子拖拽吸附特效-sunziren
    双向链表的简单Java实现-sunziren
  • 原文地址:https://www.cnblogs.com/Irvingcode/p/12300072.html
Copyright © 2020-2023  润新知