winsock获得ip地址的方法

实例代码如下:



#include<winsock.h>
#include<iostream>
#include<Windows.h>

#define ServPort 5050

#pragma comment(lib,"ws2_32.lib")

using namespace std;

void main(){
	WSADATA		wsaData;
	SOCKET		sListen;
	PHOSTENT	hostinfo;
	char		name[255];
	sockaddr_in	servAddr;
	sockaddr_in	clientAddr;
	


	WORD wVersionRequested=MAKEWORD(2,2);
	WORD Result=WSAStartup(wVersionRequested, &wsaData);
	if(Result != 0){
		cout<<"初始化错误!"<<endl;
		return;
	}

	if(wVersionRequested != wsaData.wVersion){
		cout<<"Winsock 版本不匹配!"<<endl;
		return;
	}

	string ServAddr;
	if(gethostname(name,sizeof(name)) == 0){
		if((hostinfo = gethostbyname(name))!= NULL){
			LPCSTR ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
			
			ServAddr=ip;
		
			cout<<"本机(此处作为服务器)的IP 为:"<<ip<<endl;
			cout<<"默认端口号为: 5050"<<endl;
		}
	}
	WSACleanup();

}




winsock获得ip地址的方法

1。
如果要得到当前运行主机的ip地址: 
  char hostname[128];
  gethostname( hostname , 128 );
  hostent* temp;
  temp = gethostbyname( hostname );
  for( int i=0 ; temp->h_addr_list[i]!=NULL && i<10 ; i++ )
  {
   strcpy( localHost[i] , inet_ntoa (*(struct in_addr *)temp->h_addr_list[i] ) );
  }
localhost是一个char[10][16]类型,这段代码可以得到当前主机的所有活动ip列表。实验中发现,需要立刻吧这些地址内容复制下来,只传递指针的话,这个hostent*指针以后好像会被填充上远程连接的ip地址。很是奇怪。
 
-------------------
2。
要得到远程主机的ip地址,可以通过域名来完成。
  hostent* remoteHost;
  unsigned long addr;
  if(inet_addr(dstWebHost)==INADDR_NONE)        //是不是四段点号分割的ip地址
  {
   remoteHost = gethostbyname(dstWebHost);      //填充一个hostent结构  
  }
  else
  {
   addr = inet_addr(dstWebHost);                //填充一个hostent结构  
   remoteHost = gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
  }
上面这段代码可以通过ip得到域名,也可以通过域名得到ip
----------------------------------------------------
3。
另外还有accept函数和getpeername函数可以得到相应socket的关联ip
int getpeername(
  SOCKET s,
  struct sockaddr* name,
  int* namelen
);
SOCKET accept(
  SOCKET s,
  struct sockaddr* addr,
  int* addrlen
);
参数表都一样。
用法
char addr[32];      // sockaddr_in*
  int addrlen=32;    //一定要初始化
AcceptSocket = accept( ListenSocket, (SOCKADDR*)addr , &addrlen );
 
( (sockaddr_in*)addr )->sin_addr.s_addr;//就可以返回一个unsigned long的ip地址
4。
要想得到x.x.x.x类型的ip地址字符串,就先填充一个in_addr结构
 in_addr ip;
 ip.S_un.S_addr = addr;        //unsigned long类型
 char* clientIp = inet_ntoa( ip );


你可能感兴趣的:(winsock获得ip地址的方法)