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