zoukankan      html  css  js  c++  java
  • window应用移植到Linux下(应用移植)

    
    1. 配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:QtQt5.3.05.3mingw482_32in;C:QtQt5.3.0ToolsQtCreatorin

    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++的keyword

    {

        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 ", *(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;

        //将port号和程序绑定

        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 ", 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;
    }
  • 相关阅读:
    C++中的回调函数(callback)
    C++ Primer5 练习5.12:编程统计含有两个连续字符(ff、fl、fi)的字符序列的数量
    范围for循环过程中用&修改元素
    C++资料整理(持续更新)
    问题解决:VS报错:The build tools for v140 (Platform Toolset = 'v140') cannot be found
    上传新文件至个人hexo博客的步骤
    【Ubuntu】同时安装了python2和python3,使用pip安装软件时注意
    python解析xml文件 修改xml指定标签中的内容
    实操:main(int argc,char ** argv) 输出main函数的参数
    Saga-Python笔记
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3931751.html
Copyright © 2011-2022 走看看