IP

转载请注明来源:https://www.cnblogs.com/hookjc/

获取本机IP

//#include<winsock2.h>
//连接 ws2_32.lib
void CCWebClientDlg::InitSocket()
{
 WORD  wVersionRequested;  
 WSADATA  wsaData;  
 char  name[255];  
 CString  ip; 
 int err;

 PHOSTENT  hostinfo;  
 wVersionRequested  =  MAKEWORD( 1, 1 );//版本号1.1

 


 //1.加载套接字库 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {

  return;
 }

 //判断是否我们请求的winsocket版本,如果不是
 //则调用WSACleanup终止winsocket的使用并返回            

 if ( LOBYTE( wsaData.wVersion ) != 1 ||
  HIBYTE( wsaData.wVersion ) != 1 ) {

   WSACleanup( );
   return; 
  }///...if

 if  ( err  ==  0  )  
 {  
  
  if(  gethostname  (  name,  sizeof(name))  ==  0)  
  {  
   if((hostinfo  =  gethostbyname(name))  !=  NULL)  
   {  
    ip  =  inet_ntoa  (*(struct  in_addr  *)*hostinfo->h_addr_list);  
   }  
  }  
  
  WSACleanup(  );  
 }    
 SetDlgItemText(IDC_EDIT_PORT,name);//name里是本机名  
 SetDlgItemText(IDC_IPADDRESS1,ip);  //ip中是本机IP  

获取局域网IP


Receiver.c源代码源代码

 

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "233.0.0.1" //本例解决IP - 一叶偏舟 - wdtxslqnn的博客多播组地址IP - 一叶偏舟 - wdtxslqnn的博客
#define MCASTPORT 5150 //绑定IP - 一叶偏舟 - wdtxslqnn的博客本地端口号IP - 一叶偏舟 - wdtxslqnn的博客
#define BUFSIZE 1024 //接收数据缓冲大小IP - 一叶偏舟 - wdtxslqnn的博客
int main( int argcIP - 一叶偏舟 - wdtxslqnn的博客char ** argv)
{
 WSADATA wsd;
 struct sockaddr_in localIP - 一叶偏舟 - wdtxslqnn的博客remoteIP - 一叶偏舟 - wdtxslqnn的博客from;
 SOCKET sockIP - 一叶偏舟 - wdtxslqnn的博客sockM;
 TCHAR recvbuf[BUFSIZE];
 /*struct ip_mreq mcast; // Winsock1.0 */

 int len = sizeof( struct sockaddr_in);
 int ret;
 //初始化WinSock2.2
 if( WSAStartup( MAKEWORD(2IP - 一叶偏舟 - wdtxslqnn的博客2)IP - 一叶偏舟 - wdtxslqnn的博客&wsd) != 0 )
 {
printf("WSAStartup() failed\n");
return -1;
 }
 /*
 创建一个SOCK_DGRAM类型IP - 一叶偏舟 - wdtxslqnn的博客SOCKET
 其中IP - 一叶偏舟 - wdtxslqnn的博客WSA_FLAG_MULTIPOINT_C_LEAF表示IP多播IP - 一叶偏舟 - wdtxslqnn的博客控制面层上属于"无根"类型;
 WSA_FLAG_MULTIPOINT_D_LEAF表示IP多播IP - 一叶偏舟 - wdtxslqnn的博客数据面层上属于"无根"IP - 一叶偏舟 - wdtxslqnn的博客IP - 一叶偏舟 - wdtxslqnn的博客关控制面层和
 数据面层IP - 一叶偏舟 - wdtxslqnn的博客关概念请参阅MSDN说明IP - 一叶偏舟 - wdtxslqnn的博客
 */
 if((sock=WSASocket(AF_INETIP - 一叶偏舟 - wdtxslqnn的博客SOCK_DGRAMIP - 一叶偏舟 - wdtxslqnn的博客0IP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客0IP - 一叶偏舟 - wdtxslqnn的博客
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
 {
printf("socket failed with:%d\n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
WSACleanup();
return -1;
 }
 //将sock绑定到本机某端口上IP - 一叶偏舟 - wdtxslqnn的博客
 local.sin_family = AF_INET;
 local.sin_port = htons(MCASTPORT);
 local.sin_addr.s_addr = INADDR_ANY;
 if( bind(sockIP - 一叶偏舟 - wdtxslqnn的博客(struct sockaddr*)&localIP - 一叶偏舟 - wdtxslqnn的博客sizeof(local)) == SOCKET_ERROR )
 {
printf( "bind failed with:%d \n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
 }
 //加入多播组
 remote.sin_family = AF_INET;
 remote.sin_port = htons(MCASTPORT);
 remote.sin_addr.s_addr = inet_addr( MCASTADDR );
 /* Winsock1.0 */
 /*
 mcast.imr_multiaddr.s_addr = inet_addr(MCASTADDR);
 mcast.imr_interface.s_addr = INADDR_ANY;
 if( setsockopt(sockMIP - 一叶偏舟 - wdtxslqnn的博客IPPROTO_IPIP - 一叶偏舟 - wdtxslqnn的博客IP_ADD_MEMBERSHIPIP - 一叶偏舟 - wdtxslqnn的博客(char*)&mcastIP - 一叶偏舟 - wdtxslqnn的博客

sizeof(mcast)) == SOCKET_ERROR)
 {
printf("setsockopt(IP_ADD_MEMBERSHIP) failed:%d\n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
 }
 */
 /* Winsock2.0*/
 if(( sockM = WSAJoinLeaf(sockIP - 一叶偏舟 - wdtxslqnn的博客(SOCKADDR*)&remoteIP - 一叶偏舟 - wdtxslqnn的博客sizeof(remote)IP - 一叶偏舟 - wdtxslqnn的博客

NULLIP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客
JL_BOTH)) == INVALID_SOCKET)
 {
printf("WSAJoinLeaf() failed:%d\n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
 }
 //接收多播数据IP - 一叶偏舟 - wdtxslqnn的博客当接收到IP - 一叶偏舟 - wdtxslqnn的博客数据为"QUIT"时退出IP - 一叶偏舟 - wdtxslqnn的博客
 while(1)
 {
if(( ret = recvfrom(sockIP - 一叶偏舟 - wdtxslqnn的博客recvbufIP - 一叶偏舟 - wdtxslqnn的博客BUFSIZEIP - 一叶偏舟 - wdtxslqnn的博客0IP - 一叶偏舟 - wdtxslqnn的博客

(struct sockaddr*)&fromIP - 一叶偏舟 - wdtxslqnn的博客&len)) == SOCKET_ERROR)
{
 printf("recvfrom failed with:%d\n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return -1;
}
if( strcmp(recvbufIP - 一叶偏舟 - wdtxslqnn的博客"QUIT") == 0 ) break;
else {
 recvbuf[ret] = '\0';
 printf("RECV:' %s ' FROM <%s> \n"IP - 一叶偏舟 - wdtxslqnn的博客recvbufIP - 一叶偏舟 - wdtxslqnn的博客inet_ntoa(from.sin_addr));
}
 }

 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return 0;
}

    Sender.c源代码源代码
 

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "233.0.0.1" //本例解决IP - 一叶偏舟 - wdtxslqnn的博客多播组地址IP - 一叶偏舟 - wdtxslqnn的博客
#define MCASTPORT 5150 //本地端口号IP - 一叶偏舟 - wdtxslqnn的博客
#define BUFSIZE 1024 //发送数据缓冲大小IP - 一叶偏舟 - wdtxslqnn的博客
int main( int argcIP - 一叶偏舟 - wdtxslqnn的博客char ** argv)
{
 WSADATA wsd;
 struct sockaddr_in remote;
 SOCKET sockIP - 一叶偏舟 - wdtxslqnn的博客sockM;
 TCHAR sendbuf[BUFSIZE];
 int len = sizeof( struct sockaddr_in);
 //初始化WinSock2.2
 if( WSAStartup( MAKEWORD(2IP - 一叶偏舟 - wdtxslqnn的博客2)IP - 一叶偏舟 - wdtxslqnn的博客&wsd) != 0 )
 {
printf("WSAStartup() failed\n");
return -1;
 }
 if((sock=WSASocket(AF_INETIP - 一叶偏舟 - wdtxslqnn的博客SOCK_DGRAMIP - 一叶偏舟 - wdtxslqnn的博客0IP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客0IP - 一叶偏舟 - wdtxslqnn的博客
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
 {
printf("socket failed with:%d\n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
WSACleanup();
return -1;
 }
 //加入多播组
 remote.sin_family = AF_INET;
 remote.sin_port = htons(MCASTPORT);
 remote.sin_addr.s_addr = inet_addr( MCASTADDR );
 if(( sockM = WSAJoinLeaf(sockIP - 一叶偏舟 - wdtxslqnn的博客(SOCKADDR*)&remoteIP - 一叶偏舟 - wdtxslqnn的博客
sizeof(remote)IP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客NULLIP - 一叶偏舟 - wdtxslqnn的博客
JL_BOTH)) == INVALID_SOCKET)
 {
printf("WSAJoinLeaf() failed:%d\n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
 }

 //发送多播数据IP - 一叶偏舟 - wdtxslqnn的博客当用户IP - 一叶偏舟 - wdtxslqnn的博客控制台输入"QUIT"时退出IP - 一叶偏舟 - wdtxslqnn的博客
 while(1)
 {
printf("SEND : ");
scanf("%s"IP - 一叶偏舟 - wdtxslqnn的博客sendbuf);
if( sendto(sockMIP - 一叶偏舟 - wdtxslqnn的博客(char*)sendbufIP - 一叶偏舟 - wdtxslqnn的博客strlen(sendbuf)IP - 一叶偏舟 - wdtxslqnn的博客0IP - 一叶偏舟 - wdtxslqnn的博客(struct sockaddr*)

&remoteIP - 一叶偏舟 - wdtxslqnn的博客sizeof(remote))==SOCKET_ERROR)
{
 printf("sendto failed with: %d\n"IP - 一叶偏舟 - wdtxslqnn的博客WSAGetLastError());
 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return -1;
}
if(strcmp(sendbufIP - 一叶偏舟 - wdtxslqnn的博客"QUIT")==0) break;
Sleep(500);
 }

 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return 0;
}

   

    本实例对IP多播通信进行了探讨IP - 一叶偏舟 - wdtxslqnn的博客实例源代码由Sender和Receiver两部分组成IP - 一叶偏舟 - wdtxslqnn的博客Sender用户从控制台上输入多播发送数据IP - 一叶偏舟 - wdtxslqnn的博客Receiver端都要求加入同一个多播组IP - 一叶偏舟 - wdtxslqnn的博客完成接收Sender发送IP - 一叶偏舟 - wdtxslqnn的博客多播数据IP - 一叶偏舟 - wdtxslqnn的博客

来源:python脚本自动迁移

posted @ 2020-06-29 10:51  jiangcheng_15  阅读(163)  评论(0编辑  收藏  举报