天天看点

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



配置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文件:

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

注意,这的的: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内部的相关资源

继续阅读