关于DHCP动态分配IP地址情况下的网络编程

volcary 2003-09-05 11:29:08
写了一个网络程序,结果发现在客户端是动态分配IP的情况下,有时会出现客户端掉线的情况,重新连接后客户端无法连接上服务器了。有问题如下。
1.在9x/2000下动态分配IP是如何工作的,当有一个TCP连接存在的时候,机器的IP会动态改变么。
2. 动态分配的IP在什么情况下才会发生变化
3. 如果用户的IP不是启动后分配一次就不变,那么象其他网络程序是如何适应这种情况的
...全文
212 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
footway 2003-10-12
  • 打赏
  • 举报
回复
自制代码共享!!调用GetHostIpAddr( )函数把当前计算机上的所有IP地址读出来,再看看哪个是你想要的。GetHostIPAddrByName( )函数则可以读取网络上任何一台计算机的IP地址,只要你知道该计算机的名称、域名(比如www.163.com)等。


long GetHostIPAddr( unsigned long *lpNetIP, unsigned long IPIndex )
{
char HostName[128] = {0};

if ( ::gethostname( HostName, 127 ) != 0 ) {
::OutputDebugString( "Get host's name fail!\r\n" );
return -1;
}

return GetHostIPAddrByName( lpNetIP, HostName, IPIndex );
}

long GetHostIPAddrByName( unsigned long *lpNetIP,
const CHAR *lpStrName, unsigned long IPIndex )
{
unsigned long *pTemp = NULL;
hostent *Host;
unsigned long Index = 0;

assert( lpNetIP != NULL );
assert( lpStrName != NULL );

Host = ::gethostbyname( lpStrName );
if ( Host == NULL )
{
::OutputDebugString( "Get Host's address by name fail!\r\n" );
return -1;
}

Index = 0;
while( 1 )
{
pTemp = (unsigned long *)(Host->h_addr_list[Index]);
if ( pTemp == NULL )
{
::OutputDebugString( "The IPIndex is too large!\r\n" );
return -1;
}
else if ( Index == IPIndex )
{
*lpNetIP = *((unsigned long *)pTemp);
return 0;
}
else
{
Index++;
}
}

return -1;
}
volcary 2003-10-09
  • 打赏
  • 举报
回复
在程序中使用了25009端口 结果发现这个端口 是 “25009,icl-twobase10,icl-twobase10 ”
icl-twobase10 是什么意思,谁能解释一下,有时扫描该端口不成功导致掉线是否和它有关系

Carapee 2003-09-17
  • 打赏
  • 举报
回复
你的机器和DHCP服务器之间是不是有防火墙?
Carapee 2003-09-17
  • 打赏
  • 举报
回复
开一个线程,用这个函数监控地址的变化,如果变化了,删除并更新你的客户端连接。
NotifyAddrChange
volcary 2003-09-16
  • 打赏
  • 举报
回复
up
volcary 2003-09-12
  • 打赏
  • 举报
回复
实际上程序在固定IP的情况下都是正常的,但在DHCP情况下则出问题,一般DHCP正常配置的情况下是不会出现IP变化的,那么怎么样子的配置会导致这种IP短时间内就会发生变化呢,在机器很多的情况下
gjd111686 2003-09-11
  • 打赏
  • 举报
回复
服务器侦听多个Socket为空值时加载虚函数指向自定义的函数处理
你是客户端掉线不是网络掉线所以客户端IP不会变,而且这中应用跟客户IP无关
只跟服务器IP有关系.
所以你程序的Bug跟网络环境无关,你的服务器应该有CListenSocket和CClientSocket两个派生类,你判断CClientSocket是否为空处理应该没有问题
volcary 2003-09-11
  • 打赏
  • 举报
回复
:gjd111686
能否详细说明一下,你认为问题是没有delete旧的socket么,可是这种close是怎么发生的
gjd111686 2003-09-09
  • 打赏
  • 举报
回复
你的服务器程序在CSocket::OnClose()中清理Socket就可以了
volcary 2003-09-08
  • 打赏
  • 举报
回复
这个问题没人感兴趣么,谈一些相关的知识也可以,都会给分的
DarkShow 2003-09-08
  • 打赏
  • 举报
回复
1、不会变化
2、如果IP要变化,除非你自己release或者DHCP服务器重启,或者DHCP服务器释放掉你的IP给你重新分配。
3、比如花生壳软件,就是利用固定的域名来解决动态IP的问题。其实每次机器启动,都将IP汇报到服务器,然后服务器重新将新IP绑定到域名上。就完成了动态IP固定域名的工作。每次寻找,只需要输入域名即可,不必管IP是多少。
bubble222 2003-09-08
  • 打赏
  • 举报
回复
不懂
wkgenius 2003-09-05
  • 打赏
  • 举报
回复
当主机的IP配置设为“自动获取一个IP”,并且网内存在一个DHCP服务器的时候,主机会自动获取一个有DHCP服务器分配的IP。
DHCP服务器的IP分配存在一个“租期”的概念,在租期之内,IP不会改变。
具体的情况比较复杂,这里说不明白,建议你看一下:
《用TCP/IP进行网际互联 第一卷:原理、协议与结构》,非常好的讲TCP/IP的书。
volcary 2003-09-05
  • 打赏
  • 举报
回复
希望有熟悉这方面知识的人能讲解一下,应当不难吧,看书的话谁都知道,最好说点实质的,
关于租期的情况,具体是怎样的呢,资料上讲大约是八天的时间,可是从我的程序反映来看
好象几小时间内就发生了,IP变化的情况(连接中断了),从理论上是否不可能呢,还有DHCP
服务器的不当陪置是否会导致如此,怎样的配置会产生这样的效果。
请多指教

18,356

社区成员

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

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