window应用移植到Linux下(应用移植)
配置QT的環(huán)境變量,這臺(tái)電腦à屬性à高級(jí)系統(tǒng)設(shè)置à高級(jí)à環(huán)境變量à系統(tǒng)變量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\QtCreator\bin
創(chuàng)建一個(gè)QT項(xiàng)目:winAndLinuxMyUdpProject項(xiàng)目
修改QT的項(xiàng)目文件,修改winAndLinuxMyUdpProject.pro文件:
?
注意,這的的:LIBS += -lWs2_32?? ##標(biāo)示使用window下的Ws2_32.lib,-l表示要鏈接后面的庫(kù)
4.編寫頭文件:udp.h
#ifndef UDP_H
#define UDP_H
?
//明確的告訴C++編譯器,這是一個(gè)用C語(yǔ)言編譯的函數(shù),你就不要把函數(shù)名
//轉(zhuǎn)化為C++格式了
//因?yàn)?span lang="EN-US">C++的編譯器位了方法的重載,會(huì)修改方法的名稱,如果最終的文件時(shí)
//C++為后綴的,那么就不需要加上下面一句了
extern "C"? //這里是C++的關(guān)鍵字
{
??? int socket_send(const char *IP);
??? int socket_recv();
}
#endif // UDP_H
?
5.編寫頭文件的實(shí)現(xiàn)函數(shù)
#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);//在調(diào)用WSAStatrtup要告訴widnows,我用什么版本的socket
??? WSAStartup(ver, &wsaData);//windows要求,只要用socket,第一步,必須調(diào)用這個(gè)函數(shù)
??? //初始化socket完成
#endif
??? //建立一個(gè)socket,第一個(gè)參數(shù)是指定socket要用那個(gè)協(xié)議,AF_INET代表要用TCP/IP協(xié)議
??? //第二個(gè)參數(shù)SOCK_DGRAM意思是要用UDP協(xié)議
??? //第三個(gè)參數(shù)一般默認(rèn)填0
??? SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);//定義一個(gè)socket
??? struct sockaddr_in addr;
??? memset(&addr, 0, sizeof(addr));//初始化結(jié)構(gòu)addr;
??? addr.sin_family = AF_INET;//代表要使用一個(gè)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;
???????//發(fā)送udp數(shù)據(jù)
???????rc = sendto(st, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr));
??? }
?
??? #ifdef MYLINUX
??? close(st);
#else
??? closesocket(st);//使用完socket要將其關(guān)閉
??? WSACleanup();//釋放win socket內(nèi)部的相關(guān)資源
#endif
??? return rc;
?
}
?
int socket_recv()
{
#ifndef MYLINUX
??? //初始化socket
??? DWORD ver;
??? WSADATA wsaData;
??? //在調(diào)用WSAStatrtup要告訴widnows,我用什么版本的socket
??? ver = MAKEWORD(1, 1);
??? //windows要求,只要用socket,第一步,必須調(diào)用這個(gè)函數(shù)
??? WSAStartup(ver, &wsaData);
??? //初始化socket完成
#endif
?
??? //建立一個(gè)socket,第一個(gè)參數(shù)是指定socket要用那個(gè)協(xié)議,AF_INET代表要用TCP/IP協(xié)議
??? //第二個(gè)參數(shù)SOCK_DGRAM意思是要用UDP協(xié)議
??? //第三個(gè)參數(shù)一般默認(rèn)填0
??? SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);//定義一個(gè)socket
??? struct sockaddr_in addr;
??? //初始化結(jié)構(gòu)addr;
??? memset(&addr, 0, sizeof(addr));
??? //代表要使用一個(gè)TCP/IP的地址
??? addr.sin_family = AF_INET;
??? addr.sin_port = htons(8080);//host to net short
??? //做為接收方,不需要指定具體的IP地址,接收的主機(jī)是什么IP,我就在什么IP上收數(shù)據(jù)
??? addr.sin_addr.s_addr = htonl(INADDR_ANY);
??? int rc = 0;
??? //將端口號(hào)和程序綁定
??? 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數(shù)據(jù)
???????????rc = recvfrom(st, buf, sizeof(buf), 0, (struct sockaddr *)&sendaddr, &len);
???????????//inet_ntoa(sendaddr.sin_addr);//這個(gè)函數(shù)是不可重入函數(shù)
???????????printf("%s:%s\n", inet_ntoa(sendaddr.sin_addr), buf);
???????}
??? }
#ifdef MYLINUX
close(st);
#else
??? //使用完socket要將其關(guān)閉
??? closesocket(st);
??? //釋放win socket內(nèi)部的相關(guān)資源
??? WSACleanup();
#endif
??? return rc;
}
?
6.編寫main.c #include <iostream> #include "udp.h" using namespace std; int main(int argc, char *args[]) { ??? //這一句說(shuō)明當(dāng)參數(shù)的個(gè)數(shù)大于1的時(shí)候發(fā)送消息 ??? if (argc > 1) ????{ ??????? socket_send(args[1]);//args[1]表示的是IP地址 ??? } ??? else { ??? //表示接收消息 ??????? socket_recv(); ??? } ? ??? return 0; }總結(jié)
以上是生活随笔為你收集整理的window应用移植到Linux下(应用移植)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么判断u盘真实容量 如何鉴别U盘真实容
- 下一篇: 2Ubuntu/RedHat下nfs服务