Window下UDP(socket)接和收数据案例
阅读原文时间:2023年07月11日阅读:1
  1. 配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\QtCreator\bin

  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 //这里是windows下使用socket须要的文件

#include

#include

/*接收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\n",buf);

}

}

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

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

returnrc;

}

6.编写main.c

#include

#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:\QT\build-winAndLinuxMyUdpProject-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\

  B:打开cmd窗体用于发送:

以下是接收窗体:

以下是发送窗体:

8.额外加入:

A:gcc编译过程:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

B:对于C语言来讲。编译完毕之后函数的名称不会改变。对于C++来讲。函数的名称发生改变。假设C代码中的函数。在C++中使用一定要用extern “C”keyword来说明。

    C:在unix下so文件一定要以lib开头,以so结尾