配置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
#ifndefudp_h
#defineudp_h
//明确的告诉c++编译器,这是一个用c语言编译的函数,你就不要把函数名
//转化为c++格式了
//因为c++的编译器位了方法的重载,会修改方法的名称,如果最终的文件时
//c++为后缀的,那么就不需要加上下面一句了
extern"c" //这里是c++的关键字
{
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()
//在调用wsastatrtup要告诉widnows,我用什么版本的socket
//windows要求,只要用socket,第一步必须调用这个函数
//建立一个socket,第一个参数是指定socket要用那个协议,af_inet代表要用tcp/ip协议
//第二个参数sock_dgram意思是要用udp协议
//第三个参数一般默认填0
socketst=socket(af_inet,sock_dgram,0); //定义一个socket
memset(&addr,0,sizeof(addr)); //初始化结构addr
addr.sin_addr.s_addr=htonl(inaddr_any);//做为接收方,不需要指定具体的ip地址,接收的主机是什么ip,我就在什么ip上收数据
intrc=0;
//将端口号和程序绑定
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);
}
wsacleanup(); //释放win_socket内部的相关资源