首页 > 代码库 > window应用移植到Linux下(应用移植)

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


  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

#ifndefUDP_H

#defineUDP_H

 

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

//转化为C++格式了

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

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

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

{

   intsocket_send(constchar*IP);

   intsocket_recv();

}

#endif//UDP_H

 

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

#include<stdio.h>

#include<string.h>

 

#ifdefMYLINUX

#include<sys/types.h>

#include<sys/socket.h>

#include<arpa/inet.h>

#include<unistd.h>

#defineSOCKETint

#else

#include<winsock2.h>

#endif

 

intsocket_send(constchar*IP)

{

#ifndefMYLINUX

   //初始化socket

   DWORDver;

   WSADATAwsaData;

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

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

   //初始化socket完成

#endif

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

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

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

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

   structsockaddr_inaddr;

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

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

   addr.sin_port=htons(8080);//hosttonetshort

   addr.sin_addr.s_addr=inet_addr(IP);

   //   unsignedlongladdr=inet_addr("192.168.6.200");

   //   unsignedchar*p=&laddr;

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

 

   charbuf[1024]={0};

   size_trc=0;

   while(1)

   {

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

       gets(buf);

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

           break;

       //发送udp数据

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

   }

 

   #ifdefMYLINUX

   close(st);

#else

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

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

#endif

   returnrc;

 

}

 

intsocket_recv()

{

#ifndefMYLINUX

   //初始化socket

   DWORDver;

   WSADATAwsaData;

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

   ver=MAKEWORD(1,1);

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

   WSAStartup(ver,&wsaData);

   //初始化socket完成

#endif

 

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

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

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

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

   structsockaddr_inaddr;

   //初始化结构addr;

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

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

   addr.sin_family=AF_INET;

   addr.sin_port=htons(8080);//hosttonetshort

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

   addr.sin_addr.s_addr=htonl(INADDR_ANY);

   intrc=0;

   //将端口号和程序绑定

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

   {

       charbuf[1024]={0};

       structsockaddr_insendaddr;

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

 

#ifdefMYLINUX

       socklen_tlen;

#else

       intlen;

#endif

       len=sizeof(sendaddr);

       while(1)

       {

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

           //接收udp数据

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

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

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

       }

   }

#ifdefMYLINUX

close(st);

#else

   //使用完socket要将其关闭

   closesocket(st);

   //释放winsocket内部的相关资源

   WSACleanup();

#endif

   returnrc;

}

 

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;
}