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的項目文件,修改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; }總結
以上是生活随笔為你收集整理的window应用移植到Linux下(应用移植)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么判断u盘真实容量 如何鉴别U盘真实容
- 下一篇: 2Ubuntu/RedHat下nfs服务