回声客户端:

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\n", buffer);

        //关闭套接字
        close(sock);
        return 0;
}

效果:

[linux] C语言Linux系统编程-socket回声客户端_Linux

使用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\n", buffer);

                //关闭套接字
                close(sock);}

 效果:

[linux] C语言Linux系统编程-socket回声客户端_Linux_02