是这样的.我客户端发送,数据.我先发送.数据大小..服务器.接收到大小过后.分配内存.在接收数据但是.我发现.接收的大小.和接收的数据.没有时间间隔.就会造成数据接收不完整.Sleep(100)会好.但是网络原因.也有可能效果不好..
我把代码..贴出来.请大家.帮我看一下.如何解决.
客户端:代码如下
BOOL CFileView::SendData(CString &Data,SOCKET m_socketfd1)
{
int len=strlen(Data);
FileData data;
data.strlen=len;
//发送数据大小失败,就返回
if (send(m_socketfd1,(char*)&data,sizeof(data),0)<=0)
{
return false;
}
Sleep(100);//我这里 Sleep(100)了一下.不然.接收不正常.
//初始化实际数据
char *PtrBuf=new char[len+1];//分配内存空间
strcpy(PtrBuf,Data.GetBuffer(0));//赋值
PtrBuf[len]='\0';//设置结尾
len=len+1;
//发送实际数据
int sendnum=0;
while (sendnum<len)
{
int n=send(m_socketfd1,PtrBuf+sendnum,len,0);
if (n<=0)
{
delete PtrBuf;
return false;
}
sendnum+=n;
len-=n;
}
delete PtrBuf;
return true;
}服务器端代码如下:BOOL CFileView::RecvData(SOCKET m_socket,CString &DataBuf)
{
FileData data;
memset(&data,0,sizeof(data));
//接受分区数据,实际大小。
if (recv(m_socket,(char*)&data,sizeof(data),0)<=0)
{
CString LenError;
LenError.Format("接受分区数据失败:%d",WSAGetLastError());
::MessageBox(NULL,LenError,NULL,NULL);
return FALSE;
}
Sleep(100);//我也sleep了一下
//分配内存空间。
char *PtrBuf=new char[data.strlen+1];
//接受实际数据
int recvNum=0;
int RecvLen=data.strlen;
while (recvNum<RecvLen)
{
int n=recv(m_socket,PtrBuf+recvNum,RecvLen,0);
if (n<=0)
{
break;
}
recvNum+=n;
RecvLen-=n;
}
PtrBuf[recvNum]='\0';
DataBuf=PtrBuf;
delete PtrBuf;
return true;
}不知道.如何办.才好..数据不会丢失..

解决方案 »

  1.   

    sizeof(data)大概会是多少,会不会太大了
      

  2.   

    我觉得你这样写有些问题,因为,tcp协议发送过来的时候,可能你发是一次发的,但是 tcp协议会自己分为多个包发送,这样就导致receive多次触发,按照你的这种receive做法是会出问题的我觉得顶一个自己的传输协议比较好,比如
    typedef struct pkg
    {
    starter char[1];//开始位,固定数值,根据这一位来判定包的开始
    int    len;//要传输的数据的长度
    data    char[1024];//数据内容,根据需要可以设置大一些
    end    char[1];//结束位,固定数值,根据这一位来判定包的结束}接受的时候,先从收到的数据中检索starer,如果找到,则检索长度字段,然后根据长度字段,判断接受缓冲中的数据是否足够,如果足够,则处理,如果不够,继续等待数据
      

  3.   

    一个请查下sizeof(date),另一个如3L,请加个包头好做辨别
      

  4.   

    I think you need not send the actual length of your data.
    you can send your data directly, and receive your data use recv function.
    for example:
     const int LENGTH = 5000; //big enough
     char   recvBuf[LENGTH]={0};
    while(1)
    {
    int ret = recv(yoursocket,recvBuf,LENGTH-1,0);
    if (ret == SOCKET_ERROR || ret == 0)
                        break;
                    else
                        //you can handle the recvbuf
    }
      

  5.   

    解决了。谢谢大家。。我犯了一个低级错误
    while (sendnum<len)这里有len。应该是原始。没有改过的data.strlen