int ret = 0;
ret = recv(m_s, buff, 512, 0);
if(ret == 0)
{
TRACE("Recv data error: %d\n", WSAGetLastError());
return ;
}
ret=strlen(buff)+1;
buff[ret] = '\0';
return ;
接受的buffer最大能开多大,为什么我想开成2048 就会出现非法操作??
救命!!!!!!!!!

解决方案 »

  1.   

    一個Socket封包的size最大不能超過1500byte左右!
      

  2.   

    你的buff定义了多大?ret=strlen(buff)+1;  //这里有问题,接收过来的数据不一定是字符串形式的,如果一个buf全部填满了,且没有0,你这样调用肯定错误。
    buff[ret] = '\0';  //只要上面一行不出错,这行是多余的
      

  3.   

    char buff[512]
    当我用 2048 的时候 char buff[2048] 长度应该够了 和实际接受的数据
      

  4.   

    1500byte已经是1500*8=12000这么多了 为什么我的会出错。。??神啊 救救我吧~~
      

  5.   

    int ret = 0;
    char buff[2048] ;
    memset( buff , 0 , 2048 ) ;
    ret = recv(m_s, buff, 2048, 0);
    if(ret == 0)
    {
    TRACE("Recv data error: %d\n", WSAGetLastError());
    return ;
    }
    return ;
    ]
    千山鸟飞绝,万径人踪灭。
    孤舟蓑笠翁,独钓寒江雪。
      

  6.   

    ret=strlen(buff)+1;肯定错了,删掉。
    1.现在还不能用strlen取数据。没有结束符'\0'.strlen要求字符串必须用‘\0’结束。
    2.如果你真的需要加‘\0’的话,应该直接用buff[ret] = '\0';不需要ret=strlen(buff)+1;否则会可能导致多了一个字节。出错。
    建议你将将ret返回,由调用他的模块来处理你读了多少个字节。当然你可以通过加'\0'的方式,不过你要保证你的buff足够长,至少有一个空间加'\0'吧。
    ok?
      

  7.   

    ret = recv(m_s, buff, 512, 0);RET就是收到的字节数。
      

  8.   

    现在关键的问题是我的buffer开512可行,开2048就会错
    如果最后'\0'没有处理好,那为什么512的时候可以用???。。~~~~~~~~~~~~~~~为什么~~~~~
      

  9.   

    你调试了么?
    执行非法操作前ret是多少?
    是哪一行导致非法操作的?有时候分析起来很困难,但一调试问题就很显然了。
      

  10.   

    代码改了,但是问题依旧,以为是空的时候出现问题于是还做了自己的处理
    代码如下:
                int ret = 0;
      fd_set fdread;
      FD_ZERO(&fdread);
          FD_SET(m_hSocket1,&fdread);
          timeval time={0,50};
          select(0,NULL,&fdread,NULL,&time);
      ret = recv(m_hSocket1, buff, 2048, 0);
      if(ret == 0)
    {
      TRACE("Recv data error: %d\n", WSAGetLastError());
      strcpy(buff,"null");
      return 0;
    }
      else if(ret>0)
      {
      buff[1][ret] = '\0';
      }
      else if(ret<0)
      {
      strcpy(buff,"null");
      }
      

  11.   

    哪句出错?
    ret = recv(m_hSocket1, buff, 2048, 0);?
    BUFF有2048那么大么?