您的位置:首页 > 理论基础 > 计算机网络

VC在局域网中通过http协议获取公网IP地址

2011-08-24 16:54 218 查看
最后还是用http协议请求解决了,使用wireshark截取了这个请求的内容,然后通过套接字发送给服务器,于是得到想要的ip地址:

#pragma comment(lib, "ws2_32.lib")
#include<iostream>
#include<WinSock2.h>
using namespace std;

void main()
{
char peer[] = "GET / HTTP/1.1\r\n\
User-Agent:My_Agenter\r\n\
Host:ip.dnsexit.com\r\n\r\n";
WSADATA A;
WSAStartup(MAKEWORD(2,2),&A);
SOCKET a=socket(2,1,0);
hostent *p=gethostbyname("ip.dnsexit.com");//获取主机地址
sockaddr_in addr;
addr.sin_addr=*(in_addr*)p->h_addr_list[0];//使用地址列表的第一个进行连接,实际上也只有这一个
//addr.sin_addr.S_un.S_addr=::inet_addr("67.214.175.69 \r\n");//这个是可以的,想说明函数inet_addr(char *ip)可以接受ip字符串末尾有空格和换行符而不受影响
addr.sin_family=2;
addr.sin_port=htons(80);//http的80端口
connect(a,(sockaddr*)&addr,sizeof(sockaddr_in));
send(a,peer,sizeof(peer),0);//发送http的GET请求
char text[600]={0};
recv(a,text,sizeof(text),0);//接受服务器返回的值
int i=0;
while(text[i]!='\n'||text[i+1]!='\r')//去掉前面的信息
i++;
char ip[20];
strcpy(ip,&text[i+3]);//得到ip地址开始位置,复制到字符串ip中
puts(ip);
closesocket(a);
WSACleanup();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: