我在SERVER端先发送一个字符串(是我要发送包的长度)。然后发送我实际要发的数据。
pSocket->Send( LPCTSTR(ss),strlen( ss ));
pSocket->Send( LPCTSTR(m_infoSer),m_infoSer.GetLength()); 我在CLIENT端接受的时候先是接受第一次发送的字符串,然后循环接收。
可是我发现我在第一次接受的数据里面有第二次发送的数据。这是什么原因啊?
是不是我在发送第一次的时候要做什么处理??
WSARecv( m_pClient, &dlenbuf, 1, &bLen, &Flags, NULL, NULL)(接收后dlenbuf里面有m_infoser的数据,我想让dlenbuf只有ss数据该怎么办?)
pSocket->Send( LPCTSTR(ss),strlen( ss ));
pSocket->Send( LPCTSTR(m_infoSer),m_infoSer.GetLength()); 我在CLIENT端接受的时候先是接受第一次发送的字符串,然后循环接收。
可是我发现我在第一次接受的数据里面有第二次发送的数据。这是什么原因啊?
是不是我在发送第一次的时候要做什么处理??
WSARecv( m_pClient, &dlenbuf, 1, &bLen, &Flags, NULL, NULL)(接收后dlenbuf里面有m_infoser的数据,我想让dlenbuf只有ss数据该怎么办?)
我还有两个问题
1。怎样清空缓冲区
2。在第一次发送后清空缓冲区,然后第二次发送其他数据,我在接受的时候需要接受很多次,是不是响应一次FD_READ时间就行了?
pSocket->Send( LPCTSTR(ss),10);接受方就好处理了.BTW:
RECV和SEND并不是一一对应的,
一次RECV到多次SEND的数据是正常的.
不是"固定长度".例如:
pSocket->Send( LPCTSTR(ss),10);这样前十个字节就是长度,
后面的就是内容.
{
char buf[1025];
CString str;
long bytestoread = 0; int n = Receive(buf,1024,0);
buf[n] = '\0'; long* p = (long*)buf;
bytestoread = *p;
num = n - sizeof(long);
str = (char*)buf + 4;
while(num < bytestoread)
{
n = Receive(buf,1024,0);
buf[n] = '\0';
str += (char)buf;
num += n;
}
}
你可以这样:
//接收长度
WSARecv( m_pClient, &dlenbuf, 1, &bLength, &Flags, NULL, NULL);//bLength为你发送的包的长度
while(1)//循环接收数据
{
WSARecv( m_pClient, &dlenbuf, 1, &bLen, &Flags, NULL, NULL);
//bLen为你每次发送的数据的长度
}
对,只响应一次FD_READ事件就行了!你可以这样做:
BOOL RevPacketFlag = TRUE;
FD_READ:
if (RevPacketFlag)
{
//接收长度
WSARecv( m_pClient, &dlenbuf, 1, &bLength, &Flags, NULL, NULL);//bLength为你发送的包的长度 RevPacketFlag = FALSE;
}
else
{
WSARecv( m_pClient, &dlenbuf, 1, &bLen, &Flags, NULL, NULL);
//bLen为你每次发送的数据的长度
if ()//如果数据已经接收完了
{
处理....
RevPacketFlag = TRUE;
}
}