天天看點

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内部的相關資源

繼續閱讀