TClientSocket怎样正确的关闭与TServerSocket的连接?

gust99 2003-10-19 10:10:47
因为客户程序要求和服务器断开后能够自动重连,所以我专门有一个线程来保证与服务器的连接,就是一个循环,检查连接标志,如果断开,就用OPEN方法打开SOCKET连接。但是,如果长时间不能连接到服务器,就会产生异常,“Windows socket error: 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。 (10055), on API 'connect' ”,代码如下:
void __fastcall TResumeConnectThread::Connect()
{
//TODO: Add your source code here
static int i = 0;
while(!fmFundMonitor->bExit )
{
if (!fmFundMonitor->IsConnected)
{
if (fmFundMonitor->CommClientSocket->Active)
{
fmFundMonitor->CommClientSocket->Socket->Close();
fmFundMonitor->CommClientSocket->Active = false;
}
fmFundMonitor->CommClientSocket->ClientType =ctNonBlocking;
fmFundMonitor->CommClientSocket->Host=fmFundMonitor->m_strServer;
fmFundMonitor->CommClientSocket->Port = fmFundMonitor->m_nPort;
fmFundMonitor->CommClientSocket->Active = true;
}

Sleep(500);
i++;
if (i == 3)
{
Sleep(6000*2);
i = 0;
}
}
}
...全文
220 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
bydpdcy 2003-11-25
  • 打赏
  • 举报
回复
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q196/2/71.ASP&NoWebContent=1
猛禽 2003-11-21
  • 打赏
  • 举报
回复
支持friendbcb()的方法
slothboy 2003-11-18
  • 打赏
  • 举报
回复
收藏
gust99 2003-10-25
  • 打赏
  • 举报
回复
friendbcb() ,谢谢你!你的方法应该不错,不过我被别的事拖住了,还没来得及试,我想晚点揭贴,大家多讨论一下,还有没有其他的方法。
放心,分不会少你的啦!:)
gust99 2003-10-25
  • 打赏
  • 举报
回复
继续!
kissfire 2003-10-25
  • 打赏
  • 举报
回复
UP
friendbcb 2003-10-23
  • 打赏
  • 举报
回复
已贴出代码:
你的帖:
http://expert.csdn.net/Expert/topic/2382/2382009.xml?temp=.530224
别忘了结帐哦!
gust99 2003-10-22
  • 打赏
  • 举报
回复
这是我的新代码,加了TEvent,不过,长时间连不上后,还是会出现上述问题:

void __fastcall TResumeConnectThread::Connect()
{
//TODO: Add your source code here
static int i = 0;
fmFundMonitor->bExit = false;
while(!fmFundMonitor->bExit )
{
fmFundMonitor->m_pResumeConnEvent->WaitFor(1000);

if (!fmFundMonitor->IsConnected)
{
if (fmFundMonitor->CommClientSocket->Active)
fmFundMonitor->CommClientSocket->Active = false;

fmFundMonitor->CommClientSocket->ClientType = ctNonBlocking;
fmFundMonitor->CommClientSocket->Host=fmFundMonitor->m_strServer;
fmFundMonitor->CommClientSocket->Port = fmFundMonitor->m_nPort;
fmFundMonitor->CommClientSocket->Active = true;
}

Sleep(500);
i++;
if (i == 2)
{
Sleep(6000*2);
i = 0;
}

fmFundMonitor->m_pResumeConnEvent->ResetEvent();
}
}
gust99 2003-10-22
  • 打赏
  • 举报
回复
warton(无形无声):
不太明白你的意思,能说清楚吗?

friendbcb() :
如果动态生成组件,怎样利用它的事件响应函数,该怎样写它的事件响应函数?
friendbcb 2003-10-22
  • 打赏
  • 举报
回复
补充:在定时器里重新生成ClentSocket并OPEN,连接成功时禁止定时器,测试过,没有问题,定时器的时间最好不要太短,1秒以上。
friendbcb 2003-10-22
  • 打赏
  • 举报
回复
我的方法是加一个定时器,在断开或连接失败时启动定时器,不要把ClinetScoket组件放在窗体上在运行时动态生成,如果连接错则DELETE原来的ClientSocket,从新NEW一个,最好写一个函数来新建ClientSocket并分配它的属性和事件|!
warton 2003-10-22
  • 打赏
  • 举报
回复
公告!
在onDisconnect中把异常丢掉不行吗?
yuyulily 2003-10-21
  • 打赏
  • 举报
回复
关注。。
gust99 2003-10-21
  • 打赏
  • 举报
回复
不过,怎么解决啊?大家是怎么处理自动重连这种问题的?
gust99 2003-10-21
  • 打赏
  • 举报
回复
我想应该是打开SOCKET后,如果连不上服务器,关闭SOCKET的方法不正确,然后,不断地打开SOCKET,次数多了,系统缓冲区空间就不足了。
我不懂电脑 2003-10-21
  • 打赏
  • 举报
回复
由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。
是不是服务器拒绝服务呀?
pp616 2003-10-21
  • 打赏
  • 举报
回复
那我没什么办法了。我一般不用TClientSocket组件。实在想不出什么好的办法。
用socket api吧。
gust99 2003-10-20
  • 打赏
  • 举报
回复
哎,刚试了,pp616(傻小子)的方法不行啊,同样的问题,而且,这次死的更快!
gust99 2003-10-20
  • 打赏
  • 举报
回复
songhtao(三十年孤独)
捕获到也没用啊,不能再重连了:

,“Windows socket error: 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。 (10055), on API 'connect' ”
我不懂电脑 2003-10-20
  • 打赏
  • 举报
回复
出现异常的时候捕获,处理呀。
加载更多回复(3)

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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