分组发送已经成功了!
在接受时候出现了问题(是指针的问题)
使用WSAGetLastError()得到的值为0x0000271E表示:系统检测到在一个调用中尝试使用指针参数时的无效指针地址。 
例子部分代码是:
PBYTE pSampleBuffer=new BYTE[_MAX_PATH];  //接受数据存放的地址int addr_cli_len1 = sizeof(addr_cli);
int length=pHeader->pack_size;        //总共需要接受的字节数
int Loop=((int)length)/(8*1024);      //得到循环的次数-1  //
Loop += 1;
int len=8*1024;                //每次接受的字节数(最后一次除外)
for(int i=0;i<Loop;i++)
{
bytes = recvfrom(mRcvSock, (char*)(pSampleBuffer+len*i), len, 0,
      (LPSOCKADDR) &addr_cli, (int *) &addr_cli_len1);
int j=WSAGetLastError();

{
     len=length-(8*1024)*(Loop-1);   //得到最后没有发送字节的大小
}

}使用WSAGetLastError()得到的值为0x0000271E表示:系统检测到在一个调用中尝试使用指针参数时的无效指针地址。 我知道是bytes = recvfrom(mRcvSock, (char*)(pSampleBuffer+len*i), len, 0,
      (LPSOCKADDR) &addr_cli, (int *) &addr_cli_len1);
有问题!我该怎么循环将每次得到的数据写入到pSampleBuffer中去呢
大家帮帮我呀

解决方案 »

  1.   

    第2次接收的时候, (char*)(pSampleBuffer+len*i)已经越界.你这样写不好
      

  2.   

    len=length-(8*1024)*(Loop-1)
    这一句有问题。
    len = min(length-(8*1024)*(Loop-1),8*1024);
      

  3.   

    少加了个判断条件
    if(Loop-2==i)
    {
      len=length-(8*1024)*(Loop-1);}
    也就是最后接受的数据不是8k
      

  4.   

    在程序中我也加了这个但是还是不行呀
    在发送端我已经检测确实每次都发送8k的数据,发送了11次
    但是在接受端就有问题了
    使用WSAGetLastError()得到的值为0x0000271E表示:系统检测到在一个调用中尝试使用指针参数时的无效指针地址。 
    bytes = recvfrom(mRcvSock, (char*)(pSampleBuffer+len*i), len, 0,
          (LPSOCKADDR) &addr_cli, (int *) &addr_cli_len1);
    是不是这里有什么问题呀
    len是写总共接受的字节数还是每次接受的字节数呀
      

  5.   

    gao_ming77(小明) 
    我可以加你的QQ吗我的是 531173526
    我的意思是我总共要接受的数据为80k
    每次接受8k,我申请了了一块内存.
    我接受的时候bytes = recvfrom(mRcvSock, (char*)(pSampleBuffer+len*i), len, 0,
          (LPSOCKADDR) &addr_cli, (int *) &addr_cli_len1);
    其中len是8k还是80k呀
      

  6.   

    /*PBYTE pSampleBuffer=new BYTE[_MAX_PATH];//too short, ensure pSampleBuffer is big enough.*/
    int addr_cli_len1 = sizeof(addr_cli);
    int length=pHeader->pack_size; PBYTE pSampleBuffer=new BYTE[length];int iRecvLen = 0;
    while(iRecvLen < length)
    {
       int ilen = recvfrom(mRcvSock, (char*)(pSampleBuffer+iRecvLen), len, 0,
          (LPSOCKADDR) &addr_cli, (int *) &addr_cli_len1);
     if(ilen == 0)
     {
      //error or socket closed 
      break;
     }
     iRecvLen += ilen;  
    }
      

  7.   

    len是8k,但你的缓存大小应该>80k。
    其实,这样的实现方式不太好。如果是连续发送了两次80k的东西,可能中间的包会乱掉。
    因为不保证先发先到。
    建议你的recv的缓存也只有8k,在每个发送的头上打上标识,每次也只接受8k,然后,根据接收到标识填充组合。呵呵,我上不了qq。也就没法加你了。
      

  8.   

    gao_ming77(小明) 谢谢您呀
    加我的QQ帮帮我好吗
    做我的老师引路人好吗