zoukankan      html  css  js  c++  java
  • [linux] C语言Linux系统编程-socket回声客户端

    回声客户端:

    1.所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。

    2.客户端也可以使用 write() / send() 函数向服务器发送数据,服务器也可以使用 read() / recv() 函数接收数据

    #define BUF_SIZE 100

    1.#开头的是预处理命令

    2.#define是宏定义,在编译预处理时,会对宏名进行宏代换/宏展开,就是替换掉

    scanf("%s", bufSend);

    1.scanf() 读取到空格时认为一个字符串输入结束

    2.可以使用gets()替换

    echo_server.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #define BUF_SIZE 100
    int main(){
            //创建套接字
            int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            //将套接字和IP、端口绑定
            struct sockaddr_in serv_addr;
            memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
            serv_addr.sin_family = AF_INET;  //使用IPv4地址
            serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
            serv_addr.sin_port = htons(1234);  //端口
            bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
            //进入监听状态,等待用户发起请求
            listen(serv_sock, 20);
            //接收客户端请求
            struct sockaddr_in clnt_addr;
            socklen_t clnt_addr_size = sizeof(clnt_addr);
            int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_si
    ze);
    
            char buffer[BUF_SIZE];  //缓冲区
            int strLen = read(clnt_sock, buffer, BUF_SIZE);  //接收客户端发来的数据
            write(clnt_sock, buffer,sizeof(buffer));
            //关闭套接字
            close(clnt_sock);
            close(serv_sock);
            return 0;
    }

    echo_client.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #define BUF_SIZE 100
    int main(){
            //创建套接字
            int sock = socket(AF_INET, SOCK_STREAM, 0); 
            //向服务器(特定的IP和端口)发起请求
            struct sockaddr_in serv_addr;
            memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
            serv_addr.sin_family = AF_INET;  //使用IPv4地址
            serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
            serv_addr.sin_port = htons(1234);  //端口
            connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    
            //回声客户端
            char bufSend[BUF_SIZE];
            printf("输入字符串: ");
            scanf("%s",bufSend);
            write(sock, bufSend,sizeof(bufSend));
    
            //读取服务器传回的数据
            char buffer[40];
            read(sock, buffer, sizeof(buffer)-1);
    
            printf("服务器返回: %s
    ", buffer);
    
            //关闭套接字
            close(sock);
            return 0;
    }

    效果:

    使用while(1) 让代码进入死循环,一直监听客户端的请求

    echo_server.c

            while(1){
                    int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt
    _addr_size);
    
                    char buffer[BUF_SIZE];  //缓冲区
                    int strLen = read(clnt_sock, buffer, BUF_SIZE);  //接收客户端发来的数
    据
                    write(clnt_sock, buffer,sizeof(buffer));
                    //关闭套接字
                    close(clnt_sock);
            }

    echo_client.c

            while(1){
                    //创建套接字
                    int sock = socket(AF_INET, SOCK_STREAM, 0); 
                    //向服务器(特定的IP和端口)发起请求
                    struct sockaddr_in serv_addr;
                    memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
                    serv_addr.sin_family = AF_INET;  //使用IPv4地址
                    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
                    serv_addr.sin_port = htons(1234);  //端口
                    connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    
                    //回声客户端
                    char bufSend[BUF_SIZE];
                    printf("输入字符串: ");
                    scanf("%s",bufSend);
                    write(sock, bufSend,sizeof(bufSend));
    
                    //读取服务器传回的数据
                    char buffer[40];
                    read(sock, buffer, sizeof(buffer)-1);
    
                    printf("服务器返回: %s
    ", buffer);
    
                    //关闭套接字
                    close(sock);}

     效果:

  • 相关阅读:
    登录及注册页面
    多方式登录
    git笔记
    后台主页模块设计
    auth模块迁移后需新增字段
    使用idea构建SpringBoot源码
    Springboot相关面试问题
    Springboot自动加载工具-devtools的理解与使用
    SpringBoot项目的一些简单常用配置
    Java线程池及Executor框架的理解
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8046846.html
Copyright © 2011-2022 走看看