socket一次接收到几次发送的请求,怎样处理?
我写了一个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消息接收与处理线程没什么用处,是这样吗?