【linux网络编程】基于TCP的server-client简单实现

1 Server端流程

       (1). socket()   创建socket

       (2). bind()  绑定服务器地址结构

       (3) listen()   设置监听上限

       (4). accept()   阻塞监听客户端连接

       (5). read(fd)   读socket获取客户端数据

       (6). 小--大写   toupper()

       (7). write(fd)

       (8). close();

具体代码

/*************************************************************************
 > File Name: server.c
 > Author: Winter
 > Created Time: 2021年12月15日 星期三 19时20分07秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/socket.h>
#include<ctype.h>
#include<arpa/inet.h>

#define SERVER_PORT 9527

int main(int argc, char* argv[])
{
        int lfd = 0, newfd = 0;
        int res = 0;
        char buff[BUFSIZ], client_IP[BUFSIZ];

        struct sockaddr_in server_addr, client_addr;
        socklen_t client_addr_len;

        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(SERVER_PORT);
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

        // 1 创建socket
        lfd = socket(AF_INET, SOCK_STREAM, 0);
        if (lfd == -1)
        {
                perror("socket error\n");
                exit(1);
        }

        // 2 绑定服务器地址结构
        res = bind(lfd, (struct sockaddr*)(&server_addr), sizeof(server_addr));
        if (res == -1)
        {
                perror("bind error\n");
                exit(1);
        }

        // 3 设置监听上限
        res = listen(lfd, 128);
        if (res == -1)
        {
                perror("listen error\n");
                exit(1);
        }

        // 4 阻塞监听客户端连接
        client_addr_len = sizeof(client_addr);
        newfd = accept(lfd,(struct sockaddr*)(&client_addr), &client_addr_len);
        if (newfd == -1)
        {
                perror("accept error\n");
                exit(1);
        }
        // 输出
        printf("client ip = %s, port = %d\n",
                 inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, client_IP, sizeof(client_IP)),
                ntohs(client_addr.sin_port)
                );

        while(1)
        {
                // 5 read
                res = read(newfd, buff, sizeof(buff));
                if (res == -1)
                {
                        perror("read error\n");
                        exit(1);
                }
                // 输出一下
                write(STDOUT_FILENO, buff, res);

                // 6 小写转大写
                for (int i = 0; i < res; i++)
                {
                        buff[i] = toupper(buff[i]);
                }

                // 7 write
                write(newfd, buff, res);
        }
        close(lfd);
        close(newfd);

        return 0;
}

本地先测试

运行

./server

再重开一个终端

nc 127.0.0.1 9527

2 Client端流程

       (1). socket()   创建socket

       (2). connect(); 与服务器建立连接

       (3). write() 写数据到 socket

       (4). read()  读转换后的数据。

       (5). 显示读取结果

       (6). close()

具体代码

/*************************************************************************
 > File Name: client.c
 > Author: Winter
 > Created Time: 2021年12月16日 星期四 20时03分16秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/socket.h>
#include<arpa/inet.h>

#define SERVER_PORT 9527

void sys_err(const char* str)
{
        perror(str);
        exit(1);
}

int main(int argc, char* argv[])
{
        int fd = 0;
        int res = 0;
        int count = 10;
        char buff[BUFSIZ];
        struct sockaddr_in server_addr;    // 服务器地址结构
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(SERVER_PORT);
//      inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr.s_addr);
        inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
        // 1 创建socket
        fd = socket(AF_INET, SOCK_STREAM ,0);
        if (fd == 1)
        {
                sys_err("socket error\n");
        }

        // 2 connect
        res = connect(fd, (struct sockaddr*)(&server_addr), sizeof(server_addr));
        if (res == -1)
        {
                sys_err("connect error\n");
        }

        while(count--)
        {
                // 3 写数据到socket
                res = write(fd, "hello\n", sizeof("hello"));
                if (res == -1)
                {
                        sys_err("write error\n");
                }
                sleep(1);                             // 休眠
                // 4 读取处理的结果
                res = read(fd, buff, sizeof(buff));
                if (res == -1)
                {
                        sys_err("read error\n");
                }
                // 5 显示处理结果
                int ret = write(STDOUT_FILENO, buff, res);
                if (res == -1)
                {
                        sys_err("write error2\n");
                }
        }
        close(fd);

        return 0;
}

3 测试

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络编程在 ARM-Linux 上与在其他平台上的网络编程基本相同,在 ARM-Linux 上使用的套接字函数库也是基于 BSD Socket 的。下面是一个简单网络编程实验,可以在 ARM-Linux 上运行。 首先,需要创建一个 TCP 服务器,可以使用以下代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = "Hello from server"; // Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( PORT ); // Forcefully attaching socket to the port 8080 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } valread = read( new_socket , buffer, 1024); printf("%s\n",buffer ); send(new_socket , hello , strlen(hello) , 0 ); printf("Hello message sent\n"); return 0; } ``` 这个程序创建了一个 TCP 服务器并绑定到 8080 端口。当客户端连接到服务器时,服务器会发送“Hello from server”字符串,然后关闭连接。 接下来,需要创建一个 TCP 客户端,可以使用以下代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 int main(int argc, char const *argv[]) { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // Convert IPv4 and IPv6 addresses from text to binary form if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) { printf("\nInvalid address/ Address not supported \n"); return -1; } if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } send(sock , hello , strlen(hello) , 0 ); printf("Hello message sent\n"); valread = read( sock , buffer, 1024); printf("%s\n",buffer ); return 0; } ``` 这个程序创建了一个 TCP 客户端并连接到 127.0.0.1 的 8080 端口。它发送“Hello from client”字符串,然后等待服务器的响应。 可以使用以下命令编译和运行这两个程序: ```bash arm-linux-gcc -o server server.c arm-linux-gcc -o client client.c ``` ```bash ./server & ./client ``` 这些程序应该能够在 ARM-Linux 上运行,并且客户端应该能够接收到服务器发送的“Hello from server”字符串。这个实验展示了如何在 ARM-Linux 上进行基本的网络编程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值