Socket高手指点,如何真正关闭socket?

francohe 2003-03-08 01:53:51
我的程序需要不停地轮流和多个服务器连接通信,其中就涉及多次关闭和打开套接字。我在读取数据后、读取数据超时(Timer控制)、连接超时(用Timer控制)、OnError和OnDisConnect中都添加了关闭套接字的动作。其中在OnError中是Socker->Close();其它是ClientSocket->Active = false ;但是程序运行一段时间后,ClientSocket->Active 就一直为true 为何?应该如何解决?有没有成功的应用原码参考参考啊?等ing!
...全文
256 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
常宁 2003-03-10
  • 打赏
  • 举报
回复
阻塞方式可行,没问题
francohe 2003-03-10
  • 打赏
  • 举报
回复
目前已经不能改成udp了;以前我的做法是将socket控件放到一个窗体中,通过这个new和delete方法来解决资源耗尽的问题,但是最近添加了新的操作后总是死在Clientsocket->Active = true;中,所以取消new 和delete的做法。但是就出现本贴的问题。我想知道,用阻塞方式可行么?还对服务器端有什么要求啊?有好的例子再加100分作为报答!
常宁 2003-03-10
  • 打赏
  • 举报
回复
一个TCP socket client应该仅连接一个服务器,而且应该保持长连接。否则就要考虑用udp等不需要连接的方式了。须知TCP每次连接断开后Windows并不是立刻释放连接而是放入连接池,因此频繁连接断开会耗尽windows的socket资源
francohe 2003-03-10
  • 打赏
  • 举报
回复
因为还有别的服务器需要我去访问,用超时就是想释放连接控制好访问的时间。要实现这些,你有什么好的做法呀?
常宁 2003-03-10
  • 打赏
  • 举报
回复
不一定,我想知道你为什么要用超时
francohe 2003-03-10
  • 打赏
  • 举报
回复
也就是说我要使用超时就要用阻塞的连接方式咯?对吧!
msfmegryvc 2003-03-10
  • 打赏
  • 举报
回复
good
常宁 2003-03-10
  • 打赏
  • 举报
回复
>>我在读取数据后、读取数据超时(Timer控制)、连接超时(用Timer控制)、OnError和
>>OnDisConnect中都添加了关闭套接字的动作。其中在OnError中是Socker->Close();其它是
>>ClientSocket->Active = false ;
第一,异步消息模型TCP不应该存在读取数据超时,因为它是消息驱动的而且是数据流,不存在超时后需要断开问题。
第二,连接超时,这个也不可能存在,因为是异步的,所以都是直接返回,不可能连接超时
第三,OnDisConnect中不需要添加关闭socket动作,因为这时候的关闭动作时自动的
所以你的做法肯定要出问题
francohe 2003-03-10
  • 打赏
  • 举报
回复
redpower(常宁) 你有没有好的建议啊?
常宁 2003-03-10
  • 打赏
  • 举报
回复
呵呵,这是异步消息驱动的socket,不是阻塞模型,你的做法如果不出现问题就怪了
francohe 2003-03-10
  • 打赏
  • 举报
回复
纪录?什么意思?怎么纪录呀?
netsys2 2003-03-09
  • 打赏
  • 举报
回复
Timer事件中当然可以用
Socket->Close();

你在连接上时应该记录Socket
superrx 2003-03-08
  • 打赏
  • 举报
回复
好象Socket->close()只是关闭连接,没有关闭SOCKET

好象要用Socket->Disconnect();
or Socket->Active = false;
yingying0808 2003-03-08
  • 打赏
  • 举报
回复
放在线程里,停止线程,关闭连接,关闭线程
francohe 2003-03-08
  • 打赏
  • 举报
回复
在其他地方我用了ClientSocket->Socket->Close();怎么还不行啊?始终ClientSocket->Active都为true 。为什么啊啊?我要疯了,斑竹能解释一下么?
francohe 2003-03-08
  • 打赏
  • 举报
回复
我在Timer事件中好像不能用Socket->Close() 吧?
netsys2 2003-03-08
  • 打赏
  • 举报
回复
必须用Socket->Close();才能关闭!
另:
ClientSocket->Active开关之间需要有延迟,不能刚关马上就打开.
Sleep(500);

francohe 2003-03-08
  • 打赏
  • 举报
回复
大虾都睡了?
francohe 2003-03-08
  • 打赏
  • 举报
回复
我自己Up,要不就淹死了!
有人做过么?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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