socket的send函数第二个参数传递需要发送的数据,必须将buf转换为指针,然后再取值,如果直接传值则在数据量大的时候会报10014错误
我测试的时候用一个动态byte数组,如果长度为10×1024,则直接传值能正确发送,如果是20×1024,则传值错误,通过指针传值则正确
具体点就是
Send(FClientSocket, pointer(buf)^, bufLen, 0);

Send(FClientSocket, buf, bufLen, 0);
两种方式
buf定义为Array Of Byte

解决方案 »

  1.   

    冒昧的问一句, 楼主是否学完delphi的基本语法了?就直接开始写程序? 这个问题看一下无类型参数你就明白了
      

  2.   

    动态byte数组 只是个指针
    var
     a: array of byte;a 只是个指针,a是指向第a[0]地址的指针
    var
      A: array of  Byte;
    begin
      SetLength(a, 100);
      Memo1.Lines.Add(IntToHex(Integer(@a[0]), 15));
      Memo1.Lines.Add(IntToHex(Integer(Pointer(@a)^), 15));
    end;
    这俩个是相等的var
     a: array[0..maxpath] of byte;
    @a 和@a[0]是相等的 
      

  3.   

    如果buf是byte数组的话
    Send(FClientSocket, buf, bufLen, 0); 
    和Send(FClientSocket, pointer(@buf)^, bufLen, 0); 应该是等效的.而你的这句:Send(FClientSocket, pointer(buf)^, bufLen, 0)当然会出错,因为你直接把数组的内容转成指针了
      

  4.   

    晕,更正一下.刚才没看清你是动态数组.动态数组你的这句
    Send(FClientSocket, pointer(buf)^, bufLen, 0); 
    是没错的,当然也可以这样:
    Send(FClientSocket, buf[0], bufLen, 0); 我上面说的是buf指静态数组,如:buf array[0..x] of byte;
      

  5.   

    对动态数组指针的研究例子buf动态数组,数值是0..3
    Integer(buf)=                      00D92318
    Integer(Pointer(buf))=             00D92318
    Integer(@buf[0])=                  00D92318
    Integer(pointer(@buf[0]))=         00D92318
    integer(Pointer(@buf)^)=           00D92318
    integer(Pointer(buf)^)=            33323130
    PInteger(Pointer(Pointer(@buf)^)^)=33323130
    Integer(pointer(@buf[0])^)=        33323130
    Integer(Pointer(@buf))=            0013F628
    根据这个结果,send函数一个传的是数组首地址,一个传的是值,怎么都可以呢
    send函数内部到底怎么实现的呢?
      

  6.   

        ret:=setsockopt(FSocket,SOL_SOCKET,SO_RCVBUF,pchar(@AValue),SizeOf(AValue));
        if ret=SOCKET_ERROR then raise Exception.Create('');
         ret:=setsockopt(FSocket,SOL_SOCKET,SO_SNDBUF,pchar(@AValue),SizeOf(AValue));
        if ret=SOCKET_ERROR then raise Exception.Create('');