快被折磨崩溃.关于SOCKET.求助
本帖最后由 HelpToMe 于 2013-03-26 12:10:30 编辑 先说明下情况.最近几天一直被socket句柄数折磨着.谷歌了网上的一些方法.控制住句柄后又会产生连带的问题..一直未曾解决..
程序的设计流程是这样的:
1.根据配置文件创建一定数目的clientsocket
2.用time控件定时向server发送信息.
3.读取server返回的信息.
目前这3步流程全部已经实现.
困扰在socket的close上.因为不能排除服务器故障.我是在自己电脑上运行的程序.也就是假设所有服务器都没有开启的状态下在运行客户端程序.
之前采用的方法是在socket的onerror事件里关闭socket.代码如下:
void __fastcall TfrmShow::OnSocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
Socket->Close();
}
void __fastcall TfrmShow::tmrSendTimer(TObject *Sender)
{
tmrSend->Enabled = false;
for(int i = 0;i< n_Btnnum; i++)
{
AnsiString sStr = Buttons[i]->Hint; //创建clientsocket的同时将配置文件的目标IP写入同样排序的按钮hint中,后期从这里读取目标IP地址.
SocketClient[i]->Port = m_Port;//统一的端口.
int nFlag;
if(SocketClient[i]->Active == false) //如果SocketClient关闭的.则赋值并开启.
{
SocketClient[i]->Host = sStr;
SocketClient[i]->Port = m_Port;
SocketClient[i]->Active = true;
}
nFlag = SocketClient[i]->Socket->SendText("1"); //随便发送消息.服务端收到即可响应
if(nFlag == 0) //如果发送失败
{
SocketClient[i]->Socket->Close();
Image[i]->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "\\Image\\close.png");
}
}
tmrSend->Enabled = true;
}
你可以改变一下策略。不要用长连接,改用短连接,在OnTimer里只打开socket
在OnConnect事件里发送你的数据,数据发送完关闭socket
[解决办法]
在你另一个帖子回了windows socket error:提供了一个无效的参数 10022 on API WSACANCELASYNCREQUEST,是网络不好,没数据,造成的,把你网络调好吧 。