急!Socket通讯中,如何实现数据包队列?请高手赐教!

xuytf 2002-12-17 08:46:10
我在做一个通讯程序,在客户端,我想建一个数据包队列,每发一个数据包,就设一个标志,当收到服务端的响应时,再根据ID检索队列中的该数据包,并将其删除。
请问:这个队列可以用哪些类实现,请给一些代码说明。
...全文
173 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamleejun 2003-02-18
  • 打赏
  • 举报
回复
mark
l_clove 2002-12-28
  • 打赏
  • 举报
回复
用互斥或线程同步来完成...
CRITICAL_SECTION g_WaitInitEnd;
InitializeCriticalSection(&g_WaitInitEnd);

EnterCriticalSection(&g_WaitInitEnd);
.
(访问临界资源,你的队列)
.
LeaveCriticalSection(&g_WaitInitEnd);

DeleteCriticalSection(&g_WaitInitEnd);
pp616 2002-12-22
  • 打赏
  • 举报
回复
收到响应将发送线程锁死。删除动作完成在恢复发送线程
xuytf 2002-12-17
  • 打赏
  • 举报
回复
to 明月
因为数据量很大(每次队列可能有5,6万),我用两个线程,一个用来发这个队列,另一个用来在收到响应时删除队列中相应数据包。麻烦告诉我,如何实现操作这个队列的同步?
先谢了!
poweruser 2002-12-17
  • 打赏
  • 举报
回复
可以使用STL中的list或map
hatumei 2002-12-17
  • 打赏
  • 举报
回复
typedef struct
{
int ID;
void* msg;
int Status;
}MsgElem;
class TMsgStack
{
private:
DynamicArray< MsgElem>elem ;
int count;
int upgrade;
public:
MsgStack(int,int);
void Add(MsgElem);
int Find(int Msg_Key);
MsgElem operator[](int index);
int GetLength();
};
TMsgStack::MsgStack(int cnt=10,int up=5)
{
elem.Length=cnt;
count=0;
upgrade=up;
}
void TMsgStack::Add(MsgElem e)
{
elem[count]=e;
count++;
if(count>elem.Length)
{
elem.Length=elem.Length+upgrade;
}
}
int TMsgStack::Find(int Msg_Key)
{
for(int i=0;i<count;i++)
{
if(elem[i].ID==Msg_Key)
{
return i;
}
}
return -1;
}
MsgElem TMsgStack::operator[](int index)
{
if(index>=count)
{
return NULL;
}
else
{
return elem[index];
}
}
int TMsgStack::GetLength()
{
return count;
}
warton 2002-12-17
  • 打赏
  • 举报
回复
自定义一个链吧!!

1,317

社区成员

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

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