请教socket接受数据的问题

Beginner_mine 2006-04-05 10:19:50
我用TSocketServer建了一个SocketServer,采用非阻塞模式同时接受来自24个Client的数据传输,当收到其中一个Client的数据后,先进行解包,等这个Client的数据包(一条记录分100个包)都发送完毕后,把解包后的数据组合成一条记录。
  我用OnClientRead事件中用ReadBuffer来接受.我如何来区分当前收到的包是几号Client发送的.能否为每个Client的数据接受开辟一个缓存区?
...全文
409 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joininthefun 2006-08-22
  • 打赏
  • 举报
回复
guanzhu
Beginner_mine 2006-04-06
  • 打赏
  • 举报
回复
谢谢各位...
netsys2 2006-04-05
  • 打赏
  • 举报
回复
我如何来区分当前收到的包是几号Client发送的.能否为每个Client的数据接受开辟一个缓存区?

--->每个client都和server建立了不同的socket对象,再触发读事件时,传入的socket对象是不同的!
即使同一IP来的socket也不同,所以你可以根据这个来区分数据。

常用的做法是client连接时记录其socket对象值,然后收到数据后对比socket,把数据拼包。
Beginner_mine 2006-04-05
  • 打赏
  • 举报
回复
好的.谢谢
Jim@luckeeinc.com 2006-04-05
  • 打赏
  • 举报
回复
不好意思 我没有指定Buffer的源码。
就像alloutoflove(andrew)所说的可以用个数据结构来存放对应的Client发过来的信息。用IP+端口来区分不同的Client应该是可行的。
Beginner_mine 2006-04-05
  • 打赏
  • 举报
回复
Ring_Pt,能否把指定Buffer的原码发出来看看.
Beginner_mine 2006-04-05
  • 打赏
  • 举报
回复
请问还有好点的处理模式没有?因为这个Socket要求接收数据的完整性、及时性、稳定性。
Jim@luckeeinc.com 2006-04-05
  • 打赏
  • 举报
回复
你这种工作模式应该是可行的,我们以前在做的时候也是采取先存在一边,再插数据库的方法。
而且个人觉得最好也是这么做,如果一读到数据就入库在数据量大的时候会出现问题,很有可能数据与数据之间的到达的时间间隔小于数据库的处理时间。
至于为每个Client的数据指定一个Buffer,还是用IP+端口 来区分不同的Client端
alloutoflove 2006-04-05
  • 打赏
  • 举报
回复
自己在服务端建立一个数据结构存放和具体每个Client有关的信息, 包括其相应的buffer, 不过如果照你所说的话可能要想点别的办法, buffer需要的太大了.
Beginner_mine 2006-04-05
  • 打赏
  • 举报
回复
由于数据传输的压力非常大.大概1分钟数据流量大概为20-50M之间.
当收到这些数据包后,要分别解包,把记录插入数据库.
  我是考虑这样的工作模式:SocketServer只负责接受数据,并把对应Client发送的数据包放入对应的Buffer中.我在后台用多线程来处理这Buffer中的数据,包括解包,组装,插库.
  这种工作模式是否有可行之处??
  还是一个老问题.我能否为每个Client的数据指定一个Buffer.
Jim@luckeeinc.com 2006-04-05
  • 打赏
  • 举报
回复
你所说的几号Client 应该没什么编号吧
不过是可以得到Client的IP,端口什么的信息
alloutoflove 2006-04-05
  • 打赏
  • 举报
回复
OnClientRead事件的第二参数指明了具体的客户Socket, 偶个人觉得在用这些现成控件前最好看一下API级别的原理, 否则很容易莫名其妙...
pp616 2006-04-05
  • 打赏
  • 举报
回复
或许这种方法对楼主有帮助

#include <vector>
using namespace std;
//记录socket信息的结构
typedef struct _SOCKDATA{
int iSocket;
TMemoryStream *pStm;
_SOCKDATA(const int Sock){
iSocket=Sock;
pStm=new TMemoryStream;
}
~_SOCKDATA(){delete pStm;}
}SOCKDATA,*LPSOCKDATA;
//查找对应的信息用的类
class _FindSocket{
private:
int Sock;
public:
_FindSocket(int Socket):Sock(Socket){}
bool operator()(LPSOCKDATA &Val){
return Val->iSocket==Sock;
}
};
vector<LPSOCKDATA> SockList; //socket信息列表
vector<LPSOCKDATA>::iterator SockIt; //socket信息列表元素指针
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
LPSOCKDATA pdata=new SOCKDATA(Socket->SocketHandle);
SockList.push_back(pdata);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
char *pbuf;
int irlen;
irlen=Socket->ReceiveLength();
pbuf=(char *)malloc(irlen);
Socket->ReceiveBuf(pbuf,irlen);
SockIt=find_if(SockList.begin(),SockList.end(),_FindSocket(Socket->SocketHandle));
if(SockIt!=SockList.end())
{
(*SockIt)->pStm->Write(pbuf,irlen);
}
free(pbuf);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
SockIt=find_if(SockList.begin(),SockList.end(),_FindSocket(Socket->SocketHandle));
if(SockIt!=SockList.end())
{
SockList.erase(SockIt);
delete *SockIt;
}
}

1,316

社区成员

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

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