用Delphi写了一段接收的代码,但是翻译成VC的过程中有点问题,就是动态设置缓冲区大小的问题,看代码:procedure SocketWorkThread(ns :TSocket);stdcall;
var
   recvbuf :array[0..buflen -1] of Char;  //接收数据的缓冲区
   recvAllBuff:array of Char;      //每接受一次,就把缓冲区中的数据copy到这里
   rtn,k ,i,j:Integer;
   rs :string;
   error :string;  _outTime:timeval;
  _fdSet:TFDSet;
begin
  //设置为非阻塞式
  j := 1;
  ioctlsocket(ns,FIONBIO,j);
  _outTime.tv_sec := 0;
  _outTime.tv_usec := 0;  //以下为接收代码  i := 1;  //计数器
  while true do
  begin
    FD_ZERO(_fdSet);
    FD_SET(ns,_fdSet);
    if select(ns,@_fdSet,nil,nil,@_outTime) > 0 then  //如果有可读的数据
    begin
      if FD_ISSET(ns,_fdSet) then
      begin
        rtn := recv(ns,recvbuf,buflen,0);
        
        //如果客户端断开连接
        if rtn < 1 then
        begin
          i := 1;
          for k := 0 to clientslist.Count -1 do
          begin
            if ns = pclients(clientslist.Items[k]).soc then
            begin
              clientslist.Delete(k);
              Break;
            end
            else Continue;
          end;
          closesocket(ns);
          error := IntToHex(ns,2)+'退出';
          server.mmo1.Lines.Add(error);
          ExitThread(0);
        end;        if Length(recvAllBuff) = 0 then  //第一次接收时还没有分配内存,所以=0
        begin
          SetLength(recvAllBuff,buflen);    //分配给它一个缓冲区大小的内存
        end
        else                             //第一次以后的接收代码
        begin
          if rtn = buflen then
          begin
            //如果接收到的数据量大小 = 缓冲区大小,
            //则增加recvAllBuff一个缓冲区的大小,以存放数据
            SetLength(recvAllBuff,buflen*(i));
          end
          else
          begin
            //否则,接收到多少数据,就给recvAllBuff分配多少空间
            SetLength(recvAllBuff,buflen*(i-1)+rtn);
          end;
        end;
        //把缓冲区的数据copy到recvAllBuff中
        CopyMemory(@recvAllBuff[(i-1)*buflen],@recvbuf,rtn);
        Inc(i);  //计数器自增
      end;
    end
    else    //如果没有可读的socket
    begin
      if Length(recvAllBuff)>0 then   //如果recvAllBuff不为空,说明接收到了数据
      begin
        //把recvAllBuff中的数据显示出来
        rs := PChar(recvAllBuff);
        server.mmo1.Lines.Add(rs);
        SetLength(recvAllBuff,0);   //清空内存
        i := 1;   //重置计数器
      end;
    end;
  end;
end;关键就是Delphi中的这个SetLength函数,在VC中怎么实现呢?如果不能实现的话,发送的数据一旦超出了缓冲区大小,就不好处理了。就是说VC中怎么给一个数组追加分配内存呢?难道要用链表来实现?
请高手指点一二~

解决方案 »

  1.   

    VC socket代码网络上大把的有 
      

  2.   

    在VC中,取字符串长度用
    CString str="abcedf";
    int iLength=0;iLength=str.GetLength();//取得字符串长度
      

  3.   

    recvAllBuff:array of Char;SetLength(recvAllBuff,buflen*(i));=>
    char * recvAllBuff;recvAllBuff = new char[buflen*(i)];大概是这样吧
      

  4.   

    new是在原有的内存空间基础上追加吗?我试了不行
      

  5.   

    delphi的SetLength可以动态扩大数组的,改为C++,最简的方法是用C标准函数realloc实现(它与new是有区别的)
    先定义
    char * recvAllBuff;
    然后用
      recvAllBuff=(char *)malloc(1);  //这里可用非0的任意正整数
    然后对所的
    SetLength(recvAllBuff,xxx);

    recvAllBuff=(char *)realloc(recvAllBuff,xxx);
    替换就应该可以了