window应用移植到Linux下(应用移植)

简介:  配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\QtCreator\bin 创建一个QT项目:winAndLinuxMyUdpProject项目 修改QT的项目文件,修改winAndLinuxMyUd

  1. 配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\QtCreator\bin

  2. 创建一个QT项目:winAndLinuxMyUdpProject项目

  3. 修改QT的项目文件,修改winAndLinuxMyUdpProject.pro文件:

 

注意,这的的:LIBS += -lWs2_32   ##标示使用window下的Ws2_32.lib-l表示要链接后面的库

4.编写头文件:udp.h

#ifndef UDP_H

#define UDP_H

 

//明确的告诉C++编译器,这是一个用C语言编译的函数,你就不要把函数名

//转化为C++格式了

//因为C++的编译器位了方法的重载,会修改方法的名称,如果最终的文件时

//C++为后缀的,那么就不需要加上下面一句了

extern "C"  //这里是C++的关键字

{

    int socket_send(const char *IP);

    int socket_recv();

}

#endif // UDP_H

 

5.编写头文件的实现函数

#include <stdio.h>

#include <string.h>

 

#ifdef MYLINUX

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <unistd.h>

#define SOCKET int

#else

#include <winsock2.h>

#endif

 

int socket_send(const char *IP)

{

#ifndef MYLINUX

    //初始化socket

    DWORD ver;

    WSADATA wsaData;

    ver = MAKEWORD(1, 1);//在调用WSAStatrtup要告诉widnows,我用什么版本的socket

    WSAStartup(ver, &wsaData);//windows要求,只要用socket,第一步,必须调用这个函数

    //初始化socket完成

#endif

    //建立一个socket,第一个参数是指定socket要用那个协议,AF_INET代表要用TCP/IP协议

    //第二个参数SOCK_DGRAM意思是要用UDP协议

    //第三个参数一般默认填0

    SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);//定义一个socket

    struct sockaddr_in addr;

    memset(&addr, 0, sizeof(addr));//初始化结构addr;

    addr.sin_family = AF_INET;//代表要使用一个TCP/IP的地址

    addr.sin_port = htons(8080);//host to net short

    addr.sin_addr.s_addr = inet_addr(IP);

    //    unsigned long laddr = inet_addr("192.168.6.200");

    //    unsigned char *p = &laddr;

    //    printf("%u,%u,%u,%u\n", *(p), *(p + 1),*(p + 2), *(p + 3));

 

    char buf[1024] = {0};

    size_t rc = 0;

    while(1)

    {

       memset(buf, 0, sizeof(buf));

       gets(buf);

       if (buf[0] == '0')//做为还原的退出条件

           break;

       //发送udp数据

       rc = sendto(st, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr));

    }

 

    #ifdef MYLINUX

    close(st);

#else

    closesocket(st);//使用完socket要将其关闭

    WSACleanup();//释放win socket内部的相关资源

#endif

    return rc;

 

}

 

int socket_recv()

{

#ifndef MYLINUX

    //初始化socket

    DWORD ver;

    WSADATA wsaData;

    //在调用WSAStatrtup要告诉widnows,我用什么版本的socket

    ver = MAKEWORD(1, 1);

    //windows要求,只要用socket,第一步,必须调用这个函数

    WSAStartup(ver, &wsaData);

    //初始化socket完成

#endif

 

    //建立一个socket,第一个参数是指定socket要用那个协议,AF_INET代表要用TCP/IP协议

    //第二个参数SOCK_DGRAM意思是要用UDP协议

    //第三个参数一般默认填0

    SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);//定义一个socket

    struct sockaddr_in addr;

    //初始化结构addr;

    memset(&addr, 0, sizeof(addr));

    //代表要使用一个TCP/IP的地址

    addr.sin_family = AF_INET;

    addr.sin_port = htons(8080);//host to net short

    //做为接收方,不需要指定具体的IP地址,接收的主机是什么IP,我就在什么IP上收数据

    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    int rc = 0;

    //将端口号和程序绑定

    if (bind(st, (struct sockaddr *)&addr, sizeof(addr)) > -1)

    {

       char buf[1024] = {0};

       struct sockaddr_in sendaddr;

       memset(&sendaddr, 0, sizeof(sendaddr));

 

#ifdef MYLINUX

       socklen_tlen;

#else

       int len;

#endif

       len = sizeof(sendaddr);

       while(1)

       {

           memset(buf, 0, sizeof(buf));

           //接收udp数据

           rc = recvfrom(st, buf, sizeof(buf), 0, (struct sockaddr *)&sendaddr, &len);

           //inet_ntoa(sendaddr.sin_addr);//这个函数是不可重入函数

           printf("%s:%s\n", inet_ntoa(sendaddr.sin_addr), buf);

       }

    }

#ifdef MYLINUX

close(st);

#else

    //使用完socket要将其关闭

    closesocket(st);

    //释放win socket内部的相关资源

    WSACleanup();

#endif

    return rc;

}

 

6.编写main.c
#include <iostream>
#include "udp.h"
using namespace std;
int main(int argc, char *args[])
{
    //这一句说明当参数的个数大于1的时候发送消息
    if (argc > 1) 
    {
        socket_send(args[1]);//args[1]表示的是IP地址
    }
    else
{
    //表示接收消息
        socket_recv();
    }
 
    return 0;
}
目录
相关文章
|
21天前
|
Linux Android开发
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
14 0
|
14天前
|
机器学习/深度学习 自然语言处理 Linux
【专栏】Linux 中的机器学习:Whisper适用于语音助手、翻译等领域,随着技术发展,其应用前景广阔
【4月更文挑战第28天】本文探讨了在Linux环境下,先进自动语音识别系统Whisper的运用与实现高效ASR。Whisper基于PyTorch,支持多语言识别,具有高准确性和实时性。文中介绍了安装配置Whisper的步骤,包括安装依赖、下载代码、配置环境变量及编译安装。通过数据准备、模型训练和识别,可实现语音识别功能。Whisper适用于语音助手、翻译等领域,随着技术发展,其应用前景广阔。
|
3天前
|
Linux 编译器 调度
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
本文介绍了如何将POSIX应用程序编译为在Xenomai实时内核上运行的程序。
19 1
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
|
3天前
|
消息中间件 存储 Linux
linux实时应用如何printf输出不影响实时性?
本文探讨了Linux实时任务中为何不能直接使用`printf(3)`,并介绍了实现不影响实时性的解决方案。实时任务的执行时间必须确定且短,但`printf(3)`的延迟取决于多个因素,包括用户态glibc缓冲、内核态TTY驱动和硬件。为确保实时性,通常将非实时IO操作交给低优先级任务处理,通过实时进程间通信传递信息。然而,即使这样,`printf(3)`在glibc中的实现仍可能导致高优先级任务阻塞。Xenomai 3提供了一个实时的`printf()`实现,通过libcobalt库在应用编译链接时自动处理,预分配内存,使用共享内存和线程特有数据来提高效率和实时性。
13 0
linux实时应用如何printf输出不影响实时性?
|
6天前
|
安全 Linux Shell
Linux常用命令详解与实战应用
【5月更文挑战第7天】本文详述了Linux常用命令,包括文件与目录操作(ls, cd, pwd, cp, mv, rm)、文本处理(cat, grep, sed)及系统管理(top, df, du)命令。通过实例演示了如何使用这些命令,帮助读者理解和掌握Linux操作,提升系统管理效率。学习和熟练运用这些基础命令,是高效使用Linux的关键。
|
11天前
|
Linux Shell 调度
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
|
13天前
|
存储 缓存 Linux
linux几种典型应用对系统资源使用的特点
【4月更文挑战第22天】几种典型应用对系统资源使用的特点
25 1
|
13天前
|
Linux Shell 应用服务中间件
LINUX的应用与实践
LINUX的应用与实践
19 1
|
14天前
|
安全 Linux 网络安全
【专栏】在 Linux 中,端口连接服务和应用,过多开放的端口可能带来安全隐患,教你一招找出所有开放的端口,然后直接干掉!
【4月更文挑战第28天】在 Linux 中,端口连接服务和应用,过多开放的端口可能带来安全隐患。要找出开放端口,可使用 `netstat -anp`、`lsof -i` 或 `nmap` 命令。关闭端口可通过停止相关服务、修改防火墙规则或禁用网络接口。注意不要随意关闭重要端口,操作前备份数据。保持端口安全对系统安全至关重要。
|
20天前
|
Linux
Linux中grep命令详解与实战应用
Linux中grep命令详解与实战应用
14 0