1,317
社区成员
发帖
与我相关
我的任务
分享
void __fastcall TfrmShow::tmrSendTimer(TObject *Sender)
{
tmrSend->Enabled = false;
for(int i = 0;i< n_Btnnum; i++)
{
AnsiString sStr = SocketClient[i]->Host;
SocketClient[i]->Port = m_Port;
if(SocketClient[i]->Active == false)
SocketClient[i]->Active = true;
SocketClient[i]->Socket->SendText("1"); //随便发送消息.服务端收到即可响应
}
tmrSend->Enabled = true;
}
void __fastcall TfrmShow::OnSocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
in_addr inaddr;
inaddr = Socket->Addr.sin_addr;
AnsiString sAddr = inet_ntoa(inaddr);
//出现的均是通讯有问题的数据.
for(int i = 0;i< n_Btnnum; i++)
{
if(iledZsd[i]->Hint == sAddr)
{
Image[i]->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "\\Image\\close.png");
//同时关闭此socket.防止用尽句柄
SocketClient[i]->Close();
SocketClient[i]->Active = false;
}
}
ErrorCode = 0;
}
void __fastcall TForm1::btn2Click(TObject *Sender)
{
if(ClientSocket->Active == false)
{
ClientSocket->Active = true;
int nPd;
nPd = ClientSocket->Socket->SendText(edt2->Text);
if(nPd == 0)//没有发送成功.
{
ClientSocket->Close();
ShowMessage("失败.");
}
}
else
{
int nPd;
nPd = ClientSocket->Socket->SendText(edt2->Text);
if(nPd == 0)
{
ClientSocket->Close();
ShowMessage("失败.");
}
}
}
void __fastcall TServerThread::ClientExecute(void)
{//当一个客户连接的时候进入ClientExecute
TWinSocketStream *pStream;
char Buffer[2048];
while (!Terminated && ClientSocket->Connected)
{
try
{
pStream = new TWinSocketStream(ClientSocket, 60000);
try
{
memset(Buffer, 0, 2048);
if (pStream->WaitForData(60000))
{
if (pStream->Read(Buffer, 10) == 0)
ClientSocket->Close();
Json::Value root;
Json::Value arrayObj;
for (int i = 0; i < 10; i++)
{
Json::Value item;
//机车种类
item["rq"] = "rq";
//机车种类
item["jczl"] = "jczl";
//机型
item["jx"] = "jx";
//机车号
item["jch"] = "jch";
//总走行
item["zzxgl"] = "zzxgl";
//沿线走行
item["yxgl"] = "yxgl";
//专调时间
item["zdsj"] = "zdsj";
arrayObj.append(item);
}
root["records"] = arrayObj;
ClientSocket->SendText(root.toStyledString().c_str());
}
else
{
ClientSocket->Close();
}
}
__finally
{
delete pStream;
}
}
catch (Exception &E)
{
HandleException();
}
}
}
在客户端的发送按钮代码如下(已经连接上服务端)
void __fastcall TForm1::btn2Click(TObject *Sender)
{
ClientSocket->Socket->SendText(edt2->Text);
ClientSocket->Close();
}
这样会在服务端产生一个错误:error 64,指定的网络名不再可用.
如果我去掉发送的close就不会产生这个错误...应该是才发送就关闭的原因导致的..