有时服务端地址是不固定的,需要自动获取;此时就可以通过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
25SOCKET 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
45SOCKET 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地址内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复