您的位置:首页 > 运维架构 > Linux

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

2014-08-09 19:13 197 查看


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

创建一个QT项目:winAndLinuxMyUdpProject项目

修改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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: