我是靠谱客的博主 自觉发夹,这篇文章主要介绍通过UDP广播自动获取IP地址,现在分享给大家,希望可以做个参考。

有时服务端地址是不固定的,需要自动获取;此时就可以通过UDP广播来方便地实现:

客户端,发送广播来获取地址:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    SOCKET sSrv;     sockaddr_in addrto;     WSADATA wsdata;     BOOL bsocket;     //启动SOCKET库,版本为2.0     WORD    wVer = MAKEWORD(2, 0);     if( 0 != WSAStartup(wVer,&wsdata) )     {         AfxMessageBox(L"Not Support Soket2.0");         return;     }     sSrv=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);     bsocket=TRUE;     //然后赋值给地址,用来从网络上的广播地址接收消息;     addrto.sin_family=AF_INET;     addrto.sin_addr.s_addr=INADDR_BROADCAST;     addrto.sin_port=htons(nPort); // 与服务器端的相同     //设置该套接字为广播类型     BOOL bSetBroadcast=TRUE;     setsockopt(sSrv,SOL_SOCKET,SO_BROADCAST,(char FAR *)&bSetBroadcast,sizeof(bSetBroadcast));     char    szMsg[]="Get IPAddr";     int nLen=sizeof(addrto);     if( SOCKET_ERROR==sendto(sSrv, szMsg, strlen(szMsg), 0, (sockaddr*)&addrto, nLen) )         AfxMessageBox(L"Send UDP Failed");    


服务器端,侦听,并返回自身地址:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    SOCKET sClient;     sockaddr_in clientAddr,bindAddr;     WSADATA wsdata;          //启动SOCKET库,版本为2.0     WORD    wVer=MAKEWORD(2,0);     if( 0 != WSAStartup(wVer,&wsdata) )     {         AfxMessageBox(L"Not Support Socket2.0");         return;     }          //用UDP初始化套接字     sClient=socket(AF_INET,SOCK_DGRAM,0);     //设置该套接字为广播类型,     BOOL optval=TRUE;     bindAddr.sin_family=AF_INET;     bindAddr.sin_addr.s_addr=htonl(INADDR_ANY);     bindAddr.sin_port=htons(m_nPort);     setsockopt(sClient,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));     bind(sClient,(sockaddr *)&bindAddr,sizeof(sockaddr_in));     char buf[256] = {0};     int fromlength=sizeof(SOCKADDR);     while(1)     {         int    nRet = recvfrom(sClient,buf,256,0,(struct sockaddr FAR *)&clientAddr,(int FAR *)&fromlength);         if( SOCKET_ERROR != nRet )         {             char    *pIPAddr = inet_ntoa(clientAddr.sin_addr);             if( NULL != pIPAddr )             {                 WCHAR    wzIPBuffer[32] = {0};                 CXAStrToWide(pIPAddr, wzIPBuffer, 32);                 AfxMessageBox(wzIPBuffer);             }         }         else         {             AfxMessageBox(L"Recv UDP Failed");         }         Sleep(1000);     }     closesocket(sClient);

最后

以上就是自觉发夹最近收集整理的关于通过UDP广播自动获取IP地址的全部内容,更多相关通过UDP广播自动获取IP地址内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部