Window下UDP(socket)接和收数据案例
配置QT的環(huán)境變量,這臺電腦à屬性à高級系統(tǒng)設(shè)置à高級à環(huán)境變量à系統(tǒng)變量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\QtCreator\bin
創(chuàng)建一個QT項目:winAndLinuxMyUdpProject項目
修改QT的項目文件,修改winAndLinuxMyUdpProject.pro文件:
?
注意,這的的:LIBS+= -lWs2_32??##標(biāo)示使用window下的Ws2_32.lib,-l表示要鏈接后面的庫
4.編寫頭文件:udp.h
#ifndefUDP_H
#defineUDP_H
?
//明確的告訴C++編譯器,這是一個用C語言編譯的函數(shù),你就不要把函數(shù)名
//轉(zhuǎn)化為C++格式了
//因為C++的編譯器位了方法的重載,會修改方法的名稱,如果最終的文件時
//C++為后綴的,那么就不需要加上下面一句了
extern"C"?//這里是C++的關(guān)鍵字
{
???intsocket_send(constchar*IP);
???intsocket_recv();
}
#endif//UDP_H
?
5.編寫頭文件的實現(xiàn)函數(shù)
#include<winsock2.h>?//這里是windows下使用socket需要的文件
#include<stdio.h>
#include<string.h>
?
/*接收ip地址*/
intsocket_send(constchar*IP)
{
???//初始化socket
???DWORDver;
???WSADATAwsaData;
???//在調(diào)用WSAStatrtup要告訴windows,我用什么版本的socket
???ver=MAKEWORD(1,1);
???//windows要求,只要用socket,第一步必須調(diào)用這個函數(shù)
???WSAStartup(ver,&wsaData);
???//初始化socket完成
?
?
???//建立一個socket,第一個參數(shù)是指定socket要用那個協(xié)議,AF_INET
???//代表要用TCP/IP協(xié)議
???//第三個參數(shù)SOCK_DGRAM意思是要用UDP協(xié)議
???//第三個參數(shù)一般默認(rèn)值填0
???SOCKETst=socket(AF_INET,SOCK_DGRAM,0);//定義一個socket
???structsockaddr_inaddr;
???memset(&addr,0,sizeof(addr));//初始化結(jié)構(gòu)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;
???????//發(fā)送udp數(shù)據(jù)
???????rc=sendto(st,buf,strlen(buf),0,(structsockaddr
?????????????????????????????????????????*)&addr,sizeof(addr));
???}
???closesocket(st);//使用完socket要將其關(guān)閉
???WSACleanup();//釋放winsocket內(nèi)部的相關(guān)資源
?
???returnrc;
}
?
intsocket_recv()
{
???//初始化socket
???DWORDver;
???WSADATAwsaData;
???//在調(diào)用WSAStatrtup要告訴widnows,我用什么版本的socket
???ver=MAKEWORD(1,1);
???//Windows要求,只要用Socket,第一步必須調(diào)用這個函數(shù)
???WSAStartup(ver,&wsaData);
???//初始化socket完成
?
???//建立一個socket,第一個參數(shù)是指定socket要用那個協(xié)議,AF_INET代表要用TCP/IP協(xié)議
???//第二個參數(shù)SOCK_DGRAM意思是要用UDP協(xié)議
???//第三個參數(shù)一般默認(rèn)填0
???SOCKETst=socket(AF_INET,SOCK_DGRAM,0);?//定義一個socket
???structsockaddr_inaddr;
???memset(&addr,0,sizeof(addr));?//初始化結(jié)構(gòu)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上收數(shù)據(jù)
???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數(shù)據(jù)
???????????rc=recvfrom(st,buf,sizeof(buf),0,
?????????????????????????(structsockaddr*)&sendaddr,&len);
???????????printf("%s\n",buf);
???????}
???}
???closesocket(st);//使用完socket要將其關(guān)閉
???WSACleanup();??//釋放win_socket內(nèi)部的相關(guān)資源
?
???returnrc;
}
? 6.編寫main.c #include <iostream> #include "udp.h" ? using namespace std; ? int main(int argc, char *args[]) { ??? //這一句說明當(dāng)參數(shù)的個數(shù)大于1的時候發(fā)送消息 ??? if (argc > 1) ????{ ??????? socket_send(args[1]);? // ??? } ??? else { ??? //表示接收消息 ??????? socket_recv(); ??? } ? ??? return 0; } ? 7.運行項目,項目截圖如下: A:先打開cmd窗口用于接收,進(jìn)入項目winAndLinuxMyUdpProject.exe所在位置: G:\QT\build-winAndLinuxMyUdpProject-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\? ??B:打開cmd窗口用于發(fā)送: 下面是接收窗口: 下面是發(fā)送窗口: ? 8.額外添加: A:gcc編譯過程: B:對于C語言來講,編譯完成之后函數(shù)的名稱不會改變,對于C++來講,函數(shù)的名稱發(fā)生改變,如果C代碼中的函數(shù),在C++中使用一定要用extern “C”關(guān)鍵字來說明。 ??? C:在unix下so文件一定要以lib開頭,以so結(jié)尾 ?總結(jié)
以上是生活随笔為你收集整理的Window下UDP(socket)接和收数据案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在家做什么兼职靠谱又能赚钱 这几种工作
- 下一篇: 拷贝构造,操作符重载