一个关于获得主机IP的问题。

ffllyy 2003-08-22 11:09:48
在网上下的一个例子。从www.codeproject.com上下载一个图片.操作系统2000
char buff[512];
CString s;
WSADATA wsaData;
struct hostent *hp;
unsigned int addr;
struct sockaddr_in server;
CString servername;
CString filepath;
CString filename;
ParseURL(m_url,servername,filepath,filename);
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret)
return;
s.Format("Initialized WinSock");
m_list.AddString(s);
SOCKET conn;
conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(conn==INVALID_SOCKET)
return;
s.Format("SOCKET created");
m_list.AddString(s);
if(inet_addr(servername)==INADDR_NONE)
{
hp=gethostbyname(servername);//?????
}
else
{
addr=inet_addr(servername);
hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
}
if(hp==NULL)
{
closesocket(conn);
return;
}
s.Format("hostname/ipaddress resolved");
m_list.AddString(s);
server.sin_addr.s_addr=*((unsigned long*)hp->h_addr);
server.sin_family=AF_INET;
server.sin_port=htons(80);
if(connect(conn,(struct sockaddr*)&server,sizeof(server)))
{
closesocket(conn);
return;
}
s.Format("Connected to server :- %s",servername);
m_list.AddString(s);
sprintf(buff,"GET %s\r\n\r\n",filepath);
send(conn,buff,strlen(buff),0);
s.Format("sending command :- GET %s to server",filepath);
m_list.AddString(s);
CFile f;
int y;
CString fname="c:\\";
fname+=filename;
f.Open(fname,CFile::modeCreate | CFile::modeWrite);
s.Format("starting to receive file");
m_list.AddString(s);
while(y=recv(conn,buff,512,0))
{
f.Write(buff,y);
}
f.Close();
s.Format("File downloaded and saved :- %s",fname);
m_list.AddString(s);
closesocket(conn);
s.Format("SOCKET closed");
m_list.AddString(s);
WSACleanup();
s.Format("De-Initialized WinSock");
m_list.AddString(s);

下面这个
hp=gethostbyname(servername);
在我的机器上运行得到 hp 的内容为0x00000000,我的计算机通过局域网代理服务器上网。将程序拿到服务器上运行就可以成功下载我想要的图片。为什么???请各位指点。
...全文
47 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ffllyy 2003-08-25
  • 打赏
  • 举报
回复
zhouyong0371:
谢谢。怎么避免这种错误呢?
ffllyy 2003-08-22
  • 打赏
  • 举报
回复
upup
sky51fly 2003-08-22
  • 打赏
  • 举报
回复
Up
zhouyong0371 2003-08-22
  • 打赏
  • 举报
回复
If no error occurs, gethostbyname returns a pointer to the HOSTENT structure described above. Otherwise, it returns a NULL pointer and a specific error number can be retrieved by calling WSAGetLastError.

也就是说,因为这个代码在你自己的电脑上运行的时候,gethostbyname运行失败了。具体失败的原因:
我不知道ParseURL(m_url,servername,filepath,filename);的功能,执行后servername的值可能在你的电脑上是不正确的,如果不正确,你的电脑肯定gethostbyname失败,即使成功,由于你的电脑是代理上网的,她gethostbyname只能获得局域网内的电脑,所以还是要失败。
你的电脑的IP是虚拟的,不是Internet上真实的IP

但是服务器就不同了,她的IP是真实的。
ffllyy 2003-08-22
  • 打赏
  • 举报
回复
这个问题难道就不值得大家说上一句话吗?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧