winsock客户端多线程读取问题,急呀(200分)

  • 主题发起人 主题发起人 womanlee
  • 开始时间 开始时间
W

womanlee

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位富翁,小弟在开发中遇上一问题,就是针对一个sock,要求我得客户端程序能够处理大量并发的数据包,大致思路是在客户端开一个sock,然后用几个线程去读其发送的数据包到一个队列中,然后在用其他线程来读取该队列,分发相应程序处理,不知道哪位大哥有经验的指点指点
 
是不是线程的互斥和同步啊
 
很难吗?
 
我也想如何使用?
 
我没说很难,可是我不知道,请知道的大哥指点指点
 
要求我得客户端程序能够处理大量并发的数据包,大致思路是在客户端开一个sock,然后用几个线程去读其发送的数据包到一个队列中,然后在用其他线程来读取该队列,分发相应程序处理
//大体思路:SERVER端(也就你的客户端)-》监听->开多个线程等待其他用户连接
-》ACCEPT-》各个线程处理后发送返回

你看一下可以计论一下, 如果需要的话明天给你代码! 关键还是你的需求要搞清
 
leaber我遇到的问题是这样的,我们的服务器会并发发送好几百的数据,而我的客户端接受的是采用WSAAsyncSelect然后交给我自己定义的消息去处理的,可是在数据大的时候会报错程序会关闭,我就想这种方式可能是不行的,不知道你有没有什么意见??
也就是说我要解决得是客户端,可以的话请把代码发送到我得邮箱womanlee@vip.sina.com
你有msn么??留下来交流方便一些titcacachina@hotmail.com
 
把你的接受处理代码贴出来看看。要不发我邮箱也行。LEABER@165E.COM

我没MSN, QQ:19491841
 
同时并发上百个有点头大,
试试看看能不能多开几个客户端!
 
WSAStartup(2,WSAData);
Sock:=Socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
SockAddrIn.sin_addr.S_addr:=inet_addr(PChar(ServerIP));
SockAddrIn.sin_Port:=htons(StrToInt(ServerPort));
SockAddrIn.sin_Family:=AF_INET;
SetSockOpt(Sock, SOL_SOCKET, SO_RCVBUF, Pchar(@buffer), 255);
Ret:=Connect(Sock,SockAddrIn,SizeOf(SockAddrIn));
WSAAsyncSelect(Sock,Handle,WM_SOCKET,FD_WRITE Or FD_CONNECT Or FD_CLOSE Or FD_READ);
这是连接的代码,然后交由 WM_SOCKET消息处理
procedure TForm_Main.OnSocket(Var Msg:TMessage);
Var
Ret:Integer;
Rep:TMtRepPacket;
sInfo,DialCode,sUserPhone,CurrentTimeStr:String;
Begin
CurrentTimeStr:=FormatDateTime('hh:nn:ss> ',Now);
If Msg.LParamLo=FD_CONNECT Then
MemInfo.Lines.Add(CurrentTimeStr+'连接SmGateway成功');
If Msg.LParamLo=FD_READ Then
Begin
If bIsHead Then
Begin
bIsHead:=False;
ZeroMemory(@rAceHead,SizeOf(TAceHead));
Ret:=recv(Msg.WParam,rAceHead,SizeOf(TAceHead),0);
End
Else
Begin
ZeroMemory(@Rep,SizeOf(TMtRepPacket));
bIsHead:=True;
Ret:=Recv(Msg.WParam,Rep,rAceHead.wMsgLen,0);
If Ret>SizeOf(TMsgHead) Then
Begin
Case Rep.rMsgHead.iCmdID Of
SMG_RegisterRep:
Begin
sInfo:='接收到注册返回信息(注册代码:'+Rep.rSmgRegisterRep.sServiceNumber+',注册结果:'+IntToStr(Rep.rSmgRegisterRep.byResult)+')';
MemInfo.Lines.Add(CurrentTimeStr+sInfo);
End;
SMG_UnRegisterRep:
Begin
sInfo:='接收到注销返回信息(注销代码:'+Rep.rSmgUnRegisterRep.sServiceNumber+',注销结果:'+IntToStr(Rep.rSmgUnRegisterRep.byResult)+')';
MemInfo.Lines.Add(CurrentTimeStr+sInfo);
End;
SMG_SubmitRep:
Begin
sInfo:='接收到下行返回信息(客户端序列号:'+IntToStr(Rep.rSmgSubmitRep.iClientSeqId)+'下发结果:'+IntToStr(rep.rSmgSubmitRep.byResult)+')';
//MemInfo.Lines.Add(CurrentTimeStr+sInfo);
End;
SMG_DeliverReq:
Begin
//将消息写入队列
EnQueue(Rep.rSmgDeliverReq, IndealQueueRec);
End;
End;
End;
End;
End;
If Msg.LParamLo=FD_CLOSE Then
Begin
MemInfo.Lines.Add(CurrentTimeStr+'与短信网关的连接被中断');
WSAAsyncSelect(Sock,Form_Main.Handle,WM_SOCKET,0);
CloseSocket(Sock);WSACleanup;
ConnectServerFlag:=True;
End;
End;
 
接受答案了.
 
后退
顶部