上上篇提到要做个tcp通道传送数据到服务器,刚完成调试。源码如下:
不知道附件插入成功没有。先列出代码
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]) { unsigned short port = 6789; // 服务器的端口号 char *server_ip = "119.29.206.29"; // 服务器ip地址 if( argc > 1 ) //函数传参,可以更改服务器的ip地址 { server_ip = argv[1]; } if( argc > 2 ) //函数传参,可以更改服务器的端口号 { port = atoi(argv[2]); } int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0);// 创建通信端点:套接字 if(sockfd < 0) { perror("socket"); exit(-1); } // 设置服务器地址结构体 struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr)); // 初始化服务器地址 server_addr.sin_family = AF_INET; // IPv4 server_addr.sin_port = htons(port); // 端口 inet_pton(AF_INET, server_ip, &server_addr.sin_addr.s_addr); // ip // 主动连接服务器 int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(err_log != 0) { perror("connect"); close(sockfd); exit(-1); } char send_buf[512] = {0}; printf("send data to %s:%d\n",server_ip,port); while(1) { printf("send:"); fgets(send_buf,sizeof(send_buf),stdin); // 输入内容 send_buf[strlen(send_buf)-1]='\0'; send(sockfd, send_buf, strlen(send_buf), 0); // 向服务器发送信息 } close(sockfd); return 0; }
交叉编译后传入板子:
root@myimx6ek140p:~# ls
hello quectel-CM tcp
root@myimx6ek140p:~# chmod 777 tcp
root@myimx6ek140p:~# ls
hello quectel-CM tcp
root@myimx6ek140p:~# ls -l
total 100
-rwxrwxrwx 1 root root 12084 Sep 10 2019 hello
-rwxrwxrwx 1 root root 71460 Sep 6 2019 quectel-CM
-rwxrwxrwx 1 root root 12604 Sep 20 2019 tcp
root@myimx6ek140p:~# ./tcp
send data to 119.29.206.29:6789
send:123
发送123后,在搭建的服务器上看到数据已经传输成功
这个时候,板子的ip为多少呢?,为10.56.56.37。
root@myimx6ek140p:~# ifconfig
eth0 Link encap:Ethernet HWaddr 1c:87:76:52:60:17
inet addr:192.168.137.81 Bcast:192.168.137.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth2 Link encap:Ethernet HWaddr f2:8f:a2:a1:a8:a2
inet addr:10.56.56.37 Bcast:10.56.56.39 Mask:255.255.255.252
UP BROADCAST RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:45 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2036 (1.9 KiB) TX bytes:6939 (6.7 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:140 (140.0 B) TX bytes:140 (140.0 B)
这主要是EK140通过EC20连接到了服务器,但是运营商分配的ip10.56.56.37通过路由转换
得到了113.129.160.113的公网ip。也就是必须终端主动连接服务器后才能进行服务器和终端的数据交互,。
在EK140上kill掉tcp进程后,服务器就失去了这个连接
。
预告:
下一篇完成数据的ad采集,并将数据发送到服务器。