当前位置:   article > 正文

TCP测试环境搭建[MN316_OPEN(NBIOT)连接服务器测试TCP][服务器编写程序自动回复客户端的数据]

TCP测试环境搭建[MN316_OPEN(NBIOT)连接服务器测试TCP][服务器编写程序自动回复客户端的数据]

很多时候网联网卡和服务器后台是通过TCP来连接的,这个往往是自定义的协议,而不是HTTP,当然这里可以使用别人提供的TCP服务器,比如:http://www.tongxinmao.com/App/Detail/id/1,这种方式最大的缺点就是太多人用造成很难监听到自己的数据,所以这里介绍怎么在自己的服务器上做这个TCP测试:
在这里插入图片描述
1.开放TCP端口,比如这里我自定义一个7013的端口:
在这里插入图片描述
2.使能这个端口,因为我使用的是Ubuntu的服务器,所以通过这个命令使能:
sudo ufw allow 7013
之后可以通过如下命令判断是否打开了这个端口:sudo ufw status

root@VM-12-17-ubuntu:~# sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
80                         ALLOW       Anywhere                  
9000                       ALLOW       Anywhere                  
16990                      ALLOW       Anywhere                  
27017                      DENY        Anywhere                  
19280                      DENY        Anywhere                  
22                         ALLOW       Anywhere                  
8080                       ALLOW       Anywhere                  
8081                       ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
3306                       ALLOW       Anywhere                  
7013                       ALLOW       Anywhere                  
80 (v6)                    ALLOW       Anywhere (v6)             
9000 (v6)                  ALLOW       Anywhere (v6)             
16990 (v6)                 ALLOW       Anywhere (v6)             
27017 (v6)                 DENY        Anywhere (v6)             
19280 (v6)                 DENY        Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)             
8080 (v6)                  ALLOW       Anywhere (v6)             
8081 (v6)                  ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
3306 (v6)                  ALLOW       Anywhere (v6)             
7013 (v6)                  ALLOW       Anywhere (v6)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3.使用如下命令监听我们想要的端口:
nc -lvnp 7013
在这里插入图片描述
4.用客户端连接上服务器:
在这里插入图片描述
5.这时候客户端可以点击发送按钮向服务器发送数据:
在这里插入图片描述

6.服务器这边直接在中断输入数据然后按回车即可向客户端发送数据:
在这里插入图片描述

MN316_OPEN连接服务器测试TCP

关于MN316_OPEN物联网平台环境的搭建请看文章:https://blog.csdn.net/chengdong1314/article/details/127265778
这里结合上面的TCP说明测试步骤如下:
在这里插入图片描述
因为在收到MN316_OPEN的数据后要在比较短的时间内回应数据,所以这里在监听端口后先把数据准备好,当收到MN316_OPEN发送过来的数据后立即按下回车键,这样数据就会发送到MN316_OPEN!

服务器编写程序自动回复客户端的数据
在上面的测试流程中要在服务器客户端手动输入返回的数据,这个明显不是我想要的,我想要的是自动回复客户端的数据而不是还要手动操作服务端.
这里把仓库https://gitee.com/samson10/tcp_-connection/tree/master的代码上传到服务器中:
在这里插入图片描述
使用如下命令编译server_multi_process.c文件:gcc server_multi_process.c -o tcpserver
chmod +x ./tcpserver //给程序加上可执行权限
nohup ./tcpserver & //后台运行server_multi_process
在这里插入图片描述
这时候客户端就可以连接服务器并且客户端发送什么数据,服务端就返回什么数据,server_multi_process.c源码如下:

#include <stdio.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<signal.h>
#include<wait.h>

void recyleChild(int arg){
    //回收资源
    while(1){
        int ret = waitpid(-1, NULL, WNOHANG);
        if(ret == -1){
            //所有的子进程都回收完了
            break;
        }
        else if(ret == 0){
            //还有子进程活着
            break;
        }
        else{
            printf("子进程 %d 被回收了!\n",ret);
        }
    }
}

int main(){

    struct sigaction act;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    act.sa_handler = recyleChild;
	printf("server_multi_process\n");
    //注册信号捕捉
    sigaction(SIGCHLD, &act, NULL);

    //1、创建socket
    int lfd = socket(PF_INET, SOCK_STREAM, 0);
    if(lfd == -1){
        perror("socket");
        exit(-1);
    }

    //2、绑定
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(7013);
    saddr.sin_addr.s_addr = INADDR_ANY;
    int ret = bind(lfd,(struct sockaddr *)&saddr, sizeof(saddr));
    if(ret == -1){
        perror("bind");
        exit(-1);
    }

    //3、监听
    ret = listen(lfd, 128);
    if(ret == -1){
        perror("listen");
        exit(-1);
    }

    //4、不断的循环,等待客户端连接
    while(1){
        struct sockaddr_in cliaddr;
        int len = sizeof(cliaddr);
        //接受连接,获得一个通信的文件描述符
        int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);
        if(cfd == -1){
            if(errno == EINTR){
                continue;
            }
            perror("accept");
            exit(-1);
        }

        //每连接一个进来,创建一个子进程跟客户端通信
        pid_t pid = fork();
        if(pid == 0){
            //说明是子进程,子进程进行的操作:获取客户端的信息
            char cliIP[16];
            inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, cliIP, sizeof(cliIP));
            unsigned short cliPort = ntohs(cliaddr.sin_port);
            printf("client ip: %s, client port: %d\n", cliIP, cliPort);
            //接受客户端发来的数据
            char recvBuf[1024] = {0};
            while(1){
                int datalen = read(cfd, &recvBuf, sizeof(recvBuf));
                if(datalen == -1){
                    perror("read");
                    exit(-1);
                }
                else if(datalen > 0){
                    printf("receive client data: %s\n", recvBuf);
                }
                else{
                    printf("client closed...");
                    break;
                }
                //将收到的数据返回给客户端
                write(cfd, recvBuf, strlen(recvBuf));
            }
            close(cfd);
        }
    }

    close(lfd);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109

测试功能正常,如下:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/194781
推荐阅读
相关标签
  

闽ICP备14008679号