本帖最后由 jeffc_good 于 2017-7-6 19:56 编辑
项目需要NanoPi NEO2和上位机进行TCP通讯,上位机采用TCP客户端,NanoPi NEO2上采用TCP服务器。关于将NanoPi NEO2设置为TCP服务器,即如何在Linux下TCP编程。网上教程例子很多,不再赘述。参考别人的例子编的程序如下。
- #include
- #include
- #include
- #include
- #include
- #include time.h>
- #include
- #include
- #include
- #define PORT 12345
- #define BUFFERLEN 1024
- #define BACKLOG 1
- int main(int argc, char *argv[])
- {
- char buf[BUFFERLEN];//存储接收的信息
- int server_c, client_c;
- struct sockaddr_in server; //存储服务器端socket地址结构
- struct sockaddr_in client; //存储客户端 socket地址结构
- socklen_t address_len;
- int opt;
- //根据指定的地址族、数据类型和协议来分配一个套接口的
- //描述字及其所用的资源
- server_c = socket(AF_INET, SOCK_STREAM, 0);
- if (server_c == -1)
- {
- //分配嵌套字失败
- perror("server : server socket create error");
- exit(1);
- }
-
- opt = SO_REUSEADDR;//socket可重用
- setsockopt(server_c, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
- bzero(&server, sizeof(server));//置server字节字符串前sizeof(server)个字节为零。
- server.sin_family = AF_INET; /* 地址族 */
- server.sin_port = htons(PORT);/* 端口号设定为所需地址 */
- server.sin_addr.s_addr = htonl(INADDR_ANY);/* 监听所有IP地址 */
- if(bind(server_c, (struct sockaddr *)&server, sizeof(server)) == -1)
- {
- perror("Bind() error.");
- exit(1);
- }
-
- if(listen(server_c, BACKLOG) == -1)
- {
- perror("listen() error. n");
- exit(1);
- }
- address_len = sizeof(client);
- while(1){
- if((client_c=accept(server_c,(struct sockaddr *)&client, &address_len))==-1)
- {
- perror("accept() error. n");
- exit(1);
- }
- struct timeval tv;
- gettimeofday(&tv, NULL);
- printf("Connect from client's ip %s, port %d at time %ld.%ldn",inet_ntoa(client.sin_addr),htons(client.sin_port), tv.tv_sec,tv.tv_usec);
-
- int iret=-1;
- while(1)
- {
- iret = recv(client_c, buf, BUFFERLEN, 0);
- if(iret>0)
- {
- printf("%sn", buf);
- }else
- {
- close(client_c);
- break;
- }
- send(client_c, buf, iret, 0);
- }
- }
- close(server_c);
- return 0;
- }
复制代码
而TCP客户端在Qt开发库的基础上编写,采用QTcpSocket更加的简单,需要注意的是要将network library包含在工程需要模块内,在VS下需要设置Qt->Qt Project Settings->Qt Module下的Network Library选中,而在Qt Designer中或者linux下,都需要将Network Library包含在工程设置里面。 VS中设置如下所示。
编程时,需要include:
连接动作是:
- connectToHost(Ipadress,port);
- waitForConnected();
复制代码
断开用一个函数即可:
需要读取接收的信息用函数:
发送用:
Qt通讯的界面实际效果如下所示,客户端发送数据给服务端,服务端接收到信息后原封返回给客户端。
|