• Window下UDP(socket)接和收数据案例


    
    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

    #ifndefUDP_H

    #defineUDP_H

     

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

    //转化为C++格式了

    //由于C++的编译器位了方法的重载,会改动方法的名称,假设终于的文件时

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

    extern"C" //这里是C++的keyword

    {

       intsocket_send(constchar*IP);

       intsocket_recv();

    }

    #endif//UDP_H

     

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

    #include<winsock2.h> //这里是windows下使用socket须要的文件

    #include<stdio.h>

    #include<string.h>

     

    /*接收ip地址*/

    intsocket_send(constchar*IP)

    {

       //初始化socket

       DWORDver;

       WSADATAwsaData;

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

       ver=MAKEWORD(1,1);

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

       WSAStartup(ver,&wsaData);

       //初始化socket完毕

     

     

       //建立一个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);

     

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

       }

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

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

     

       returnrc;

    }

     

    intsocket_recv()

    {

       //初始化socket

       DWORDver;

       WSADATAwsaData;

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

       ver=MAKEWORD(1,1);

       //Windows要求,仅仅要用Socket,第一步必须调用这个函数

       WSAStartup(ver,&wsaData);

       //初始化socket完毕

     

       //建立一个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=htonl(INADDR_ANY);//做为接收方,不须要指定详细的IP地址。接收的主机是什么IP,我就在什么IP上收数据

       intrc=0;

       //将port号和程序绑定

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

       {

           charbuf[1024]={0};

           structsockaddr_insendaddr;

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

           intlen=sizeof(sendaddr);

     

           while(1)

           {

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

               //接收udp数据

               rc=recvfrom(st,buf,sizeof(buf),0,

                             (structsockaddr*)&sendaddr,&len);

               printf("%s ",buf);

           }

       }

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

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

     

       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]);  //
        }
        else
    {
        //表示接收消息
            socket_recv();
        }
     
        return 0;
    }
     
    7.执行项目,项目截图例如以下:
    A:先打开cmd窗体用于接收,进入项目winAndLinuxMyUdpProject.exe所在位置:
    G:QTuild-winAndLinuxMyUdpProject-Desktop_Qt_5_3_0_MinGW_32bit-Debugdebug  
      B:打开cmd窗体用于发送:
    以下是接收窗体:
    以下是发送窗体:
     
    8.额外加入:
    A:gcc编译过程:
    B:对于C语言来讲。编译完毕之后函数的名称不会改变。对于C++来讲。函数的名称发生改变。假设C代码中的函数。在C++中使用一定要用extern “C”keyword来说明。
        C:在unixso文件一定要以lib开头,以so结尾
     
  • 相关阅读:
    人月神教α阶段冲刺报告(6/12)
    人月神教α阶段冲刺报告(5/12)
    人月神教-α阶段冲刺报告(4/12)
    人月神教-α阶段冲刺报告(3/12)
    结对作业2
    结对作业1
    软工实践作业1
    Matrix Power Series(POJ 3233)
    Blocks(POJ 3734)
    Traveling by Stagecoach(POJ 2686)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6917616.html
Copyright © 2020-2023  润新知