ServerSocket在阻塞方式下收发信息

yiweichun 2005-01-27 05:09:12
小弟在用ServerSocket在阻塞方式下收发信息时出现问题,不知如何使用多线程的方式实现ServerSocket的接收与发送?
...全文
149 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
大海1986 2005-01-27
  • 打赏
  • 举报
回复
先学习下 关注!!
yiweichun 2005-01-27
  • 打赏
  • 举报
回复
谢了,我研究研究先
constantine 2005-01-27
  • 打赏
  • 举报
回复
class TForm1 : public TForm
{
__published: // IDE-managed Components
TServerSocket *ServerSocket1;
void __fastcall ServerSocket1GetThread(TObject *Sender,
TServerClientWinSocket *ClientSocket,
TServerClientThread *&SocketThread);
void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------
class MyThread : public TServerClientThread
{
private:
UINT FTimeOut;
TWinSocketStream* WskStream;
protected:
void __fastcall ClientExecute();
public:
__fastcall MyThread(TServerClientWinSocket*);

__property UINT TimeOut = { read=FTimeOut, write=FTimeOut };
};

//主程序
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ServerSocket1->Port = 100;
ServerSocket1->ServerType
= stThreadBlocking;
ServerSocket1->Active = true;
}
//-------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
ServerSocket1->Active = false;
}
//------------------------------------------------------------
void __fastcall TForm1::ServerSocket1GetThread(TObject *Sender,
TServerClientWinSocket *ClientSocket,
TServerClientThread *&SocketThread)
{
SocketThread = new MyThread(ClientSocket);
SocketThread->Resume();
}
//-----------------------------------------------------------
__fastcall MyThread::MyThread(TServerClientWinSocket* socket)
: TServerClientThread(true,socket)
{
}
//---------------------------------------------------------
//示范程序里,收到的数据写到文件"test*.dat"
void __fastcall MyThread::ClientExecute()
{
int len;
FILE *fp;
char buf[2048];
static int num=0;

TimeOut = 300000; //300秒
WskStream = new TWinSocketStream(
ClientSocket, TimeOut);

while(1) {
sprintf(buf, "test%04x.dat",
num++);
if (!FileExists(buf)) {
fp = fopen(buf, "wb");
if (fp!=NULL) break;
}
}
try {
DWORD dwTick = GetTickCount();
while(ClientSocket->Connected
&& !Terminated) {
if (!WskStream->WaitForData(
5000)) {
if (GetTickCount()-dwTick
<TimeOut)
continue;
//在规定时间内没有收到数据,
//结束线程
break;
}
len = WskStream->Read(buf,
sizeof(buf));
dwTick = GetTickCount();
if (len <= 0) {
//读数据出错,这儿做一些
//处理
break;
}
//添加收到数据的处理,这儿写到
//文件 test*.dat 中 ...
fwrite(buf, 1, len, fp);
}
if (ClientSocket->Connected)
ClientSocket->Close();
}
catch(Exception& e) {
MessageBox(0, e.Message.c_str(),
"Error", MB_ICONERROR);
}
fclose(fp); delete WskStream;
}
//-------------------------------------------------------
这个可以参考,好象是jsp老大写o
constantine 2005-01-27
  • 打赏
  • 举报
回复
用indy控件就是阻塞的,非要用ServerSocket,到faq里面找找

1,317

社区成员

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

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