一个socket程序,运行一段时间后,需要重启机器才能连接上对方。什么原因啊?

pfans 2008-09-24 04:08:08
重启程序没有效果,只有重启机器才行。
...全文
359 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 pfans 的回复:]
"MaxUserPort"=dword:0000fffe
是修改系统动态分配最大端口号吗?
"TcpTimedWaitDelay"=dword:00000005
等待时间是5秒还是5毫秒?
[/Quote]
不是端口数,而是连出的数量
5秒
pfans 2008-09-25
  • 打赏
  • 举报
回复
"MaxUserPort"=dword:0000fffe
是修改系统动态分配最大端口号吗?
"TcpTimedWaitDelay"=dword:00000005
等待时间是5秒还是5毫秒?
僵哥 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 pfans 的回复:]
引用 18 楼 unsigned 的回复:
引用 17 楼 pfans 的回复:
引用 13 楼 ouyh12345 的回复:
应该是socket资源没有释放。
进程结束后,系统资源是不会自动释放的


进程结束后,系统资源如果没有其它进程使用,系统会释放它,即使你在进程结束前没有释放资源系统也会释放。

Socket资源不会立即释放.


说得有道理。
其实我也怀疑是TIME_WAIT的缘故。但这是不是需要短时间大量的主动关闭动作才会引发所有的socke…
[/Quote]
这个问题是比较麻烦的.如果系统的要求并不是太过苛刻,可以考虑将注册表当中Timedwaitedelay的时间设置缩短.然后增加可用连接数.
[code=INIFile][HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"MaxUserPort"=dword:0000fffe
"TcpTimedWaitDelay"=dword:00000005[/code]
pfans 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 unsigned 的回复:]
引用 17 楼 pfans 的回复:
引用 13 楼 ouyh12345 的回复:
应该是socket资源没有释放。
进程结束后,系统资源是不会自动释放的


进程结束后,系统资源如果没有其它进程使用,系统会释放它,即使你在进程结束前没有释放资源系统也会释放。

Socket资源不会立即释放.
[/Quote]

说得有道理。
其实我也怀疑是TIME_WAIT的缘故。但这是不是需要短时间大量的主动关闭动作才会引发所有的socket都处于TIME_WAIT状态啊?
僵哥 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 unsigned 的回复:]
引用 17 楼 pfans 的回复:
引用 13 楼 ouyh12345 的回复:
应该是socket资源没有释放。
进程结束后,系统资源是不会自动释放的


进程结束后,系统资源如果没有其它进程使用,系统会释放它,即使你在进程结束前没有释放资源系统也会释放。

Socket资源不会立即释放.
[/Quote]
更正一下,应该不能说是socket描述符资源,而是端口资源.
blackcat242 2008-09-25
  • 打赏
  • 举报
回复
是不是句柄占用太多了,没有释放掉啊
僵哥 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 pfans 的回复:]
引用 13 楼 ouyh12345 的回复:
应该是socket资源没有释放。
进程结束后,系统资源是不会自动释放的


进程结束后,系统资源如果没有其它进程使用,系统会释放它,即使你在进程结束前没有释放资源系统也会释放。
[/Quote]
Socket资源不会立即释放.
pfans 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ouyh12345 的回复:]
应该是socket资源没有释放。
进程结束后,系统资源是不会自动释放的
[/Quote]

进程结束后,系统资源如果没有其它进程使用,系统会释放它,即使你在进程结束前没有释放资源系统也会释放。
scq2099yt 2008-09-25
  • 打赏
  • 举报
回复
应该是socket资源没有释放。
进程结束后,系统资源是不会自动释放的
pfans 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 loverx 的回复:]
最好的方法,发布新的build,加log

如果client采用指定端口通信,而没有设置端口重用
主动关闭后,由于timewait,会在1--4分钟内,连接不上

客户说连接不上,是一直连接不上?还是连不上就重起了?
[/Quote]

client采用的是系统分配的端口,应该不需要端口重用。这个client本身是一个服务程序,所以客户不会一直等下去,他们尝试连不上就重启了。
这个现象不是经常出现,只是有时出现。
一般情况下,关闭程序再启动都很正常。
僵哥 2008-09-25
  • 打赏
  • 举报
回复
用netstat -na -o查看一下端口使用状况.
ouyh12345 2008-09-25
  • 打赏
  • 举报
回复
应该是socket资源没有释放。
进程结束后,系统资源是不会自动释放的
pfans 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 RuanJianRenAtMSN 的回复:]
你审请的内存没有删除,比如你要发收数据时审请的内存,查查当出错时有没有删除丢
如下
char *chBUF = new char[20];

int ret = recv(sock,chbuf,20,0); ->这边堵塞了,你关了你的程序没删除内存

if(ret == SOCKET_ERROR)
{
return ->这边返回了,没删除
}

opt;..
delete chbuf
[/Quote]

如果是这类问题,程序重启就可以解决了,不需要重启机器
loverx 2008-09-25
  • 打赏
  • 举报
回复
最好的方法,发布新的build,加log

如果client采用指定端口通信,而没有设置端口重用
主动关闭后,由于timewait,会在1--4分钟内,连接不上

客户说连接不上,是一直连接不上?还是连不上就重起了?
RuanJianRenAtMSN 2008-09-25
  • 打赏
  • 举报
回复
你审请的内存没有删除,比如你要发收数据时审请的内存,查查当出错时有没有删除丢
如下
char *chBUF = new char[20];

int ret = recv(sock,chbuf,20,0); ->这边堵塞了,你关了你的程序没删除内存

if(ret == SOCKET_ERROR)
{
return ->这边返回了,没删除
}

opt;..
delete chbuf

pfans 2008-09-25
  • 打赏
  • 举报
回复
问题是如果因为太多资源被占用的话,重启程序后资源会被系统释放的呀。
WinEggDrop 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 pfans 的帖子:]
重启程序没有效果,只有重启机器才行。
[/Quote]

估摸着太多资源被占用.你可以在程序无法向外连接时打开IE访问网站,如果一样无法访问的话,那肯定是太多资源被占用,系统无法腾出资源去建立socket句柄.
mmidd 2008-09-24
  • 打赏
  • 举报
回复
加载dll时出问题吧
pfans 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cnzdgs 的回复:]
出错之后,不重启电脑,重新调试程序,看看执行到哪里出问题。
[/Quote]
因为在客户那里出现的这个现象,没法调试。:(
pfans 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhoujianhei 的回复:]
感觉没有调用closesocket
[/Quote]

如果没有调用closesocket,那么重启程序就可以了,程序退出后,系统会自动释放的。
加载更多回复(4)

18,356

社区成员

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

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