socket的send函数第二个参数传递需要发送的数据,必须将buf转换为指针,然后再取值,如果直接传值则在数据量大的时候会报10014错误
我测试的时候用一个动态byte数组,如果长度为10×1024,则直接传值能正确发送,如果是20×1024,则传值错误,通过指针传值则正确
具体点就是
Send(FClientSocket, pointer(buf)^, bufLen, 0);
与
Send(FClientSocket, buf, bufLen, 0);
两种方式
buf定义为Array Of Byte
我测试的时候用一个动态byte数组,如果长度为10×1024,则直接传值能正确发送,如果是20×1024,则传值错误,通过指针传值则正确
具体点就是
Send(FClientSocket, pointer(buf)^, bufLen, 0);
与
Send(FClientSocket, buf, bufLen, 0);
两种方式
buf定义为Array Of 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]是相等的
Send(FClientSocket, buf, bufLen, 0);
和Send(FClientSocket, pointer(@buf)^, bufLen, 0); 应该是等效的.而你的这句:Send(FClientSocket, pointer(buf)^, bufLen, 0)当然会出错,因为你直接把数组的内容转成指针了
Send(FClientSocket, pointer(buf)^, bufLen, 0);
是没错的,当然也可以这样:
Send(FClientSocket, buf[0], bufLen, 0); 我上面说的是buf指静态数组,如:buf array[0..x] of byte;
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函数内部到底怎么实现的呢?
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('');