socket一次接收到几次发送的请求,怎样处理?

li602714 2008-04-07 09:41:04
我写了一个socket程序,TCP流模式,服务端recv客户端send的命令请求作相应处理,
可是由于效率的问题,有时等到服务端recv数据时,客户端已经send了几次(客户端数据量较大),按一条命令的格式进行分析拆分就会出问题,认为是错误的命令。
我只想到一种方法,协议要求客户端send的命令请求以;号结束,这样我可以从recv到的数据中每次取;号前的部份来处理,可是要考滤客户端发送出错的情况啊,如果客户端send的命令请求没有以;号结束就不好办了,它会和下一条正确的命令一起被取出分析,会导致两条一起出错,有什么好的方法可以解决这个问题呢?请各位指教,谢谢!

大致代码如下:
WSAStartup(WSA_VERSION,&wsaData)
SOCKET m_ListenSkt = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bind(m_ListenSkt,(sockaddr*)&m_SktAddr,sizeof(m_SktAddr)

bind成功后开了监听线程
AfxBeginThread(SktListenThreadPro,(LPVOID)m_ListenSkt,0,0,NULL);

/////////////////////////////////////////////////////////////////////////////////
//// 监听线程执行函数
UINT SktListenThreadPro(LPVOID lparam)
{
SOCKET m_ListenSkt = (SOCKET)lparam;
//listen on a socket
listen(m_ListenSkt,20)

//accept a connection
SOCKET m_ServerSkt;
while(1)
{
m_ServerSkt = INVALID_SOCKET;

while(m_ServerSkt == INVALID_SOCKET)
{
m_ServerSkt = accept(m_ListenSkt,NULL,NULL);
}
//创建SOCKET消息接收与处理线程
AfxBeginThread(SktRecvThreadPro,(LPVOID)m_ServerSkt,0,0,NULL);
}
return 0;
}

///////////////////////////////////////////////////////////////////////////////
//// 消息接收与处理线程执行函数
UINT SktRecvThreadPro(LPVOID lparam)
{
int iRecv;
char cRecvbuf[100];
CString sRecv,sSend;
SOCKET m_ServerSkt = (SOCKET)lparam;

while(1)
{
iRecv = 0;
memset(cRecvbuf,'\0',sizeof(cRecvbuf));

//在这里会出现问题:一次读取到多次发送的数据
//或许不是问题,但应该怎样处理?????????????????????????????
iRecv=recv(m_ServerSkt,cRecvbuf,100,0);

if((iRecv == 0) || (iRecv == SOCKET_ERROR))
return 1;//网络中断或读取错误,退出线程中断连接

////////////////////////////////////////////////////////////////////
////处理消息,返回结果
sRecv = cRecvbuf;
sSend = m_TelecomSocket.DisposeRequest(sRecv);
////////////////////////////////////////////////////////////////////

send(m_ServerSkt,sSend,sSend.GetLength(),0)
}
return 0;
}

另,因为客户端发送的数据虽然多但客户端没几个,感觉创建SOCKET消息接收与处理线程没什么用处,是这样吗?
...全文
649 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-04-30
  • 打赏
  • 举报
回复
什么呀
Stefine 2008-04-19
  • 打赏
  • 举报
回复
TCP粘包问题吧
这得自己把协议解析清楚就OK了

一般做法:
发送的请求包,包头+包体
包头: 请求类型,包大小,等
hurryboylqs 2008-04-15
  • 打赏
  • 举报
回复
TCP保证先发先到,你们定好用户协议,比如每次就发buffer[2048];

接的时候用个while循环接,接满2048个字节再解析
N_star 2008-04-15
  • 打赏
  • 举报
回复
我最近也碰到这问题,我的解决办法是在每个send()后跟上个Sleep(sleep_time),当然你觉得不需要停的地方就别sleep了,不然传输速度太慢
neversaydie518 2008-04-15
  • 打赏
  • 举报
回复
最好重新定一下协议,加上报头,报头里保存本次发送数据的长度
ZiSheng 2008-04-14
  • 打赏
  • 举报
回复
给你一个方法
//开启服务
listen() //监听
createthread(A)//参数省略
//在A线程里边
A()
{
while(1)
{
clientsocket=accept();
createthread(client)//为连接成功的客户创建一个线程
}
}
//client线程里边
client()
{
while(1)
{
recv(command)
switch(command)
case 1:

case 2://为不同的命令进行不同的处理

}
}
skyful123 2008-04-14
  • 打赏
  • 举报
回复
我觉得应该 格式化命令~ 然后服务端 根据格式大小在缓冲区去读~

不知道这样行不行~
li602714 2008-04-14
  • 打赏
  • 举报
回复
楼上的,一收一发恐怕不是一种有效率的方法吧?
51365133 2008-04-14
  • 打赏
  • 举报
回复
服务器 客户端
resv send
send确认 resv接收 服务器接收成功标示,然后继续send

--------------------------
在交互中添加 通信确认,就可以了.
li602714 2008-04-14
  • 打赏
  • 举报
回复
命令语法如下:

命令名:参数名1=参数值1, 参数名2=参数值2,...;

每命令以‘;’结束。
li602714 2008-04-14
  • 打赏
  • 举报
回复
7、8楼的大哥,答非所问了,不过也谢谢指教
li602714 2008-04-14
  • 打赏
  • 举报
回复
先谢过楼上的,不过我说的和楼上理解的稍有差异,
比如,客户端发来消息
open:filename=1234;
服务端收到后自然好办,取分号前为命令,等号后为参数,执行相应的操作就行
可如果发了几次消息时服务端才收到(大量处理数据时就是常有的事,并不能保证一收一发),如
open:filename=1234;open:filename=5678;
这个时候可就有点不好办了,不能作为一条命令来处理,而要作为二条命令来处理,
我现在的作法是收到消息后,按分号将消息依次取出,分别执行,
这样就要求客户端每次发送的消息格式都应正确,不然会出现问题,比如
open:filename;1234=open:filename=5678;
导致一次收到的几条命令都会作废,
有人建议在客户端规范格式,可是一来客户端不是我可控的(是其它单位写,双方商议协议)
二来,你收到别人给你汇款也要检查一下吧,不会是别人说多少就算多少吧,
所以我觉得按分号拆分命令是不可靠的,
求高见。
Torch009 2008-04-13
  • 打赏
  • 举报
回复
up
mr.zhoux 2008-04-12
  • 打赏
  • 举报
回复
socket一次接收到几次发送的请求,怎样处理?


计算机处理数据不存在一次处理好几个东西.不是分时间片运行就是按顺序运行,
hityct1 2008-04-12
  • 打赏
  • 举报
回复
TCP是流。一个一个处理呗。
li602714 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iawfnusr 的回复:]
加个协议头和协议尾
[/Quote]
不太明白,能不能详细一点,谢谢
TeddyGe 2008-04-07
  • 打赏
  • 举报
回复
另,因为客户端发送的数据虽然多但客户端没几个,感觉创建SOCKET消息接收与处理线程没什么用处,是这样吗?

说一下自己的理解不知道对不对:

线程不能解决Socket消息传输的阻塞问题, 只是解决了阻塞主线程的问题.
li602714 2008-04-07
  • 打赏
  • 举报
回复
我知道我的处理有问题,我问的是我应该怎样做?
scq2099yt 2008-04-07
  • 打赏
  • 举报
回复
协议没问题还是自己处理的问题
iawfnusr 2008-04-07
  • 打赏
  • 举报
回复
加个协议头和协议尾
加载更多回复(1)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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