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

2017-12-16 18:55:01来源:cnblogs.com作者:陶士涵人点击

分享

回声客户端:

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 100int 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_size);        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 100int 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;}

效果:

使用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);}

 效果:

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台