13,825
社区成员
发帖
与我相关
我的任务
分享
void __fastcall TMyServerThread::ClientExecute(void)
{
TWinSocketStream *pStream;
char Buffer[10];
// make sure connection is active
while (!Terminated && ClientSocket->Connected)
{
try
{
Stream = new TWinSocketStream(ClientSocket, 60000);
try
{
memset(Buffer, 0, 10); // initialize the buffer
// give the client 60 seconds to start writing
if (pStream->WaitForData(60000))
{
if pStream->Read(Buffer, 10) == 0) // if can抰 read in 60 seconds
ClientSocket->Close(); // close the connection
// now process the request
...
}
else
ClientSocket->Close(); // if client doesn抰 start, close
}
__finally
{
delete pStream;
}
}
catch (Exception &E)
{
HandleException();
}
}
}
void __fastcall TXXXX::SocketOnTimer(System::TObject* Sender)
{
if(ClientSocket->Socket->Connected == false) return;
if(SocketStream->WaitForData(10)) //设置等待数据超时时间,如果你是在线程中,可以通过while循环来检查
{
char RecvBuf[4096];
memset(RecvBuf, 0, sizeof(RecvBuf));
int recvlen = SocketStream->Read(RecvBuf, sizeof(RecvBuf));
SP_LOGINFO(__FUNC__, "接收字节 [ "+IntToStr(recvlen)+" ]");
if(recvlen<=0)
{
SP_LOGINFO(__FUNC__, "连接关闭");
SocketTimer->Enabled = false;
if(SocketStream)
delete SocketStream;
SocketStream = NULL;
ClientSocket->Active = false;
FActived = false;
return;
}
if(recvlen < sizeof(ThirdPartyEventHead))
{
SP_LOGERROR(__FUNC__, "接收字节小于包头大小,放弃");
return;
}
int readlen = 0;
char* recvbuf = RecvBuf;
while(readlen<recvlen)
{
recvbuf = recvbuf + readlen;
recvlen = recvlen - readlen;
readlen = DoEventMsg(recvbuf, recvlen, ClientSocket->Socket);
}
}
}
class MyThread :public TThread{
Protected:
void __fastcall Execute(void);
};
void __fastcall MyThread::Execute(void)
{
TClientSocket *Client= new TClientSocket(NULL);
try{
Client->Address = "192.168.10.1";
Client->Port = 80;
Client->ClientType = ctBlocking;//不能使用消息,所以不会有事件通知,只能使用Blocking模式
Client->Open();
...
}__finally{
Client->Free();
}
}