实例代码如下:
#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 );