windows下QT前台和linux下后台程序通过socket通信

通常情况下,linux下的后台程序不需要GUI进行展示,而前台程序往往有个界面,方便和用户的交互。本文所演示的例
子,是QT
程序和后台linux进程(C语言)交互,通过socket传输的内容是结构体。因为QT本身是跨平台的框架,因此以后前端程序移植到其它平台依然能很好
的运行。

结构体的定义如下:

struct Test
             {
                     int a;
                     char b;
             };

QT程序:windows系统,使用QT提供的服务器类QTCPServer 、QTcpSocket和相关函数。

linux下的C程序:通过linux提供的socket编程接口,连接服务器,并发送结构体。

QT程序的关键代码如下:

void TcpServerDemo::on_listenButton_clicked()
             {
                     this->tcpServer = new TcpServer(this);

QString ip;
                     ip = ui->ipLineEdit->text();
                     QString port ;
                     port = ui->portLineEdit->text();

if (! this->tcpServer->listen(QHostAddress(ip), (quint16)(port.toInt())))
                     {
                             QMessageBox::warning(this, tr("tcp server"),
                             tr("listen error:%1").arg(this->tcpServer->errorString()));
                             return;
                     }
                     ui->listenButton->setEnabled(false);
             }

void TcpServer::incomingConnection ( int socketDescriptor )
             {
                     this->tcpSocket = new QTcpSocket(this);
                     this->tcpSocket->setSocketDescriptor(socketDescriptor);
                     QObject::connect(this->tcpSocket, SIGNAL(readyRead()),
                     this, SLOT(on_ready_read()));
             }

void TcpServer::on_ready_read()
             {
                     struct Test t;
     
                     this->tcpSocket->read((char *)&t,sizeof(t));
     
     
                     QMessageBox::warning(NULL, tr("tcp server"),
                     tr("a=%1 b=%2").arg(t.a).arg(t.b));
             }

linux下C程序的关键代码:

int sockfd;
             struct sockaddr_in servaddr;//, myaddr;
             struct Test* p;
             char buf[N] = {0};
             ssize_t n;
     
             if (argc != 3)
             {
                     printf("usage:%s serverip serverport\n", argv[0]);
                     return 0;
             }
     
             if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
             {
                     perror("socket");
                     return -1;
             }
     
             memset(&servaddr, 0, sizeof(servaddr));
             servaddr.sin_family = PF_INET;
             servaddr.sin_port = htons(atoi(argv[2]));//error htons("6000");
             servaddr.sin_addr.s_addr = inet_addr(argv[1]);
     
             if (-1 == connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))
             {
                     perror("connect");
                     return -1;
             }
     
             p = (struct Test *)buf;
             printf("input a b:");
             scanf("%d", &p->a);
             getchar();
             scanf("%c", &p->b);
             printf("a=%d b=%d\n", p->a, p->b);
     
             if (-1 == send(sockfd, p, sizeof(buf), 0))
             {
                     perror("send");
                     return -1;
             }
     
             memset(buf, 0, N);
             if ((n = recv(sockfd, buf, N, 0)) == -1)
             {
                     perror("recv");
                     return -1;
             }
     
             p = (struct Test *)buf;
             printf("a=%d b=%c", p->a, p->b);
             printf(">");
     
             close(sockfd);

windows下QT前台和linux下后台程序通过socket通信

时间: 2024-12-19 17:37:29

windows下QT前台和linux下后台程序通过socket通信的相关文章

Linux下adb驱动问题Linux下使用手机USB调试模式连接ADB进行Android程序的调试

Linux 下adb 驱动问题 Linux下使用手机USB调试模式连接ADB进行Android程序的调试,配置驱动没有Windows来的直观. 具体步骤首先确认手机连接上电脑,lsusb查看下设备记录. [email protected]:~$ lsusb Bus 007 Device 009: ID 18d1:4e12 Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 006 Device 001: ID 1d

解决ubuntu14.04下Qt 5.3.1 下的QtCreator fcitx,ibus不能输入中文

ubuntu 14.04从Qt官网下载的最新版qt,安装过程很顺利,但却发现没办法输入中文(我用的是 fcitx), 即使下载了fcitx-frontend-qt5和fcitx-frontend-qt4也还是没用. 想必是qt版本的原因吧. 后来,试着将从源中安装的fcitx-frontend-qt5复制到Qt安装目录下,竟然可以了. 方法如下(fcitx输入法): 1.安装fcitx-frontend-qt5 2.将安装后的fcitx-frontend-qt5复制到qt安装目录 通常,fcit

Linux下的tree命令 --Linux下目录树查看

Linux下的tree命令 --Linux下目录树查看 有时我们需要生成目录树结构,可以使用的有ls -R,但是实际效果并不好 这时需要用到tree命令,但是大部分Linux系统是默认不安装该命令的,需要自己安装一下;tree的常见用法: tree -a  #显示所有 tree -d  #仅显示目录 tree -L n  #n代表数字..表示要显示几层... tree -f  #显示完整路径..

linux下java程序与C语言程序通过SOCKET通信的简单例子

linux下java程序与C语言程序通过SOCKET通信的简单例子 今天上午实验了java程序与c语言程序通过socket进行通信.由于没学过java,因此只是编写了C语言端的代码,java端的代码是从网上别的文章中找的,经过少量修改后与C语言端程序通信成功. 本例中C语言端作为服务器,java端作为客户端 代码如下: /****************** server program *****************/ #include <stdio.h> #include <sy

Windows下的Memcache安装 linux下的Memcache安装

linux下的Memcache安装: 1. 下载 memcache的linux版本,注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent. 官方网址:http://memcached.org/ 2. 安装 pecl::memcache. 用 pecl 命令行工具安装: pecl install memcache 或直接从源码安装: phpize ./configure make make install Windows下的Memcache安装: 1. 下

解决ubuntu14.04下Qt 5.3.1下的QtCreator fcitx,ibus不能输入中文

http://my.oschina.net/u/219482/blog/341452 感谢作者 ubuntu 14.04从Qt官网下载的最新版qt,安装过程很顺利,但却发现没办法输入中文(我用的是 fcitx), 即使下载了fcitx-frontend-qt5和fcitx-frontend-qt4也还是没用. 想必是qt版本的原因吧. 后来,试着将从源中安装的fcitx-frontend-qt5复制到Qt安装目录下,竟然可以了. 方法如下(fcitx输入法): 1.安装fcitx-fronten

[moka同学笔记]window下.htacess文件 与linux下.htacess文件

windows下 # Turn on URL rewritingRewriteEngine On # Installation directoryRewriteBase / # Protect hidden files from being viewed<Files .*>    Order Deny,Allow    Deny From All</Files> # Protect application and system files from being viewedRewr

windos 下的文件在 linux 下出现 ^M 及解决办法

1.windows 下编辑好的文件 asm_compile.txt,在 linux 下显示如下: $ cat -v asm_compile.txt 1) ml.exe /c /coff /I d:\masm32\include reg_test.asm^M 2) link.exe /subsystem:windows /libpath:d:\masm32\lib reg_test.obj^M ^M 2.解决办法 $ tr -d '\r' < asm_compile.txt > new_comp

Linux下安装Redis及Linux下php安装Redis扩展

下载源码:wget http://redis.googlecode.com/files/redis-2.8.19.tar.gz 1.解压安装:  wget http://download.redis.io/releases/redis-2.8.19.tar.gz   tar xzf redis-2.8.19.tar.gz   cd redis-2.8.19  make   make install  cp redis.conf /etc/ 参数介绍: make install命令执行完成后,会在