关于ServerSocket/ClientSocket的并发和接收问题

jayshida 2007-05-28 02:08:59
我写了一个c/s模式的服务器客户端

server要向某个用户发送消息我写了一个函数根据用户的handle值来分别发送
//对某个用户发送信息
void SomeSend(AnsiString Msg, int SomeHandle)
{
for(int i = 0 ; i < Form1->ServerSocket1->Socket->ActiveConnections; i ++ )
{
if( Form1->ServerSocket1->Socket->Connections[i]->SocketHandle == SomeHandle )
{
Form1->ServerSocket1->Socket->Connections[i]->SendText(Msg);//发送信息
break;
}
}
}
----------------------------------------------------------------------------------------

然后在主程序server的Read里用
int ClientHandle;
ClientHandle = Socket->SocketHandle;来记录某个用户发送消息来时的handle值.在对应返回消息

因为客户端异常退出的话,server端和client(断开)的连接还存在着.

所以我用了2个timer来对用户发送消息

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
for( int i = 0; i < ListView1->Items->Count ; i ++ )
{
if( ListView1->Items->Item[i]->SubItems->Strings[4] == "Yes" )
{
ListView1->Items->Item[i]->SubItems->Strings[4] = "No";//如果在线,设为不在线

}
Form1->ServerSocket1->Socket->Connections[i]->SendText(JiaMi("GetYesNo"));//并且对所有用户发送消息
}
}


void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
int Timers;
for( int i = 0; i < ListView1->Items->Count ; i ++ )
{
if( ListView1->Items->Item[i]->SubItems->Strings[4] == "No")
{
if( ListView1->Items->Item[i]->SubItems->Strings[5] == Edit18->Text )
{
//如果用户超过2次无返回消息回来,证明已经死机
ServerSocket1->Socket->Connections[i]->Close();//关闭该用户
SomePlayerBoolAdd(); //重新排列用户ID表
}
else
{
Timers = StrToInt(ListView1->Items->Item[i]->SubItems->Strings[5]);
Timers++;
ListView1->Items->Item[i]->SubItems->Strings[5] = IntToStr(Timers);
}
}
}
}


----------------------------------------------------------------------------------------

现在我的问题是这样的.
比如说我的ListView1->Items->Count有大约5000个人.

那么timer1对5000个人发送消息后
5000个人肯定会返回消息给我.
那么我这里取出的handle会不会乱掉?

由于我刚开始一直是在本机测试,所以只登陆了大约30个人左右`,没问题~.要是大概有5000个人的话`会不会有问题了?
纯属讨论~~

int ClientHandle;
ClientHandle = Socket->SocketHandle;
...全文
278 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
pp616 2007-05-31
  • 打赏
  • 举报
回复
5000个长连接还是比较恐怖的。TServerSocket 做不来的。indy也好不到哪去。

IOCP 是ms推举的管理大数量连接的模式。试试那个吧。
constantine 2007-05-30
  • 打赏
  • 举报
回复
5000?貌似这个控件很难支持到这么多的用户,性能不太好。用indy好点,用户多server最好还是用IOCP。
rainfall19831109 2007-05-29
  • 打赏
  • 举报
回复
多并发并且一定要使用这对控件的话
建议还是把模式改成阻塞模式并且使用线程处理。。。

1,317

社区成员

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

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