rt
解决方案 »
- 用ODAC的OraQuery查询到DBGridEh显示并修改,怎么设置都是自动提交,不能人工控制事务吗?
- 如何实现ListView点一下CheckBox全选再点下取消全选
- listview问题!!!
- 我该不该继续学Delphi?迷茫中......请大家多多指点.
- XML问题:TXMLDocument为何释放不了内存,大家快帮忙看看,非常感谢
- 文件操作:定义了个结构,但其中string[] 最大255个字符,太少了,怎么办?
- 一个字符串问题
- 来不及。。。。。。。。。。。。
- 如何实现两幅图片前后换位
- delhpi中在oracle中如何根据日期查询?
- 如何使窗口最大化时连任务栏也屏蔽了。
- 请问一个作图的问题,怎么样才能坐标轴不动,而曲线可以随时间往左移动呢?
var TP: Array [1..3] of Byte;
.......客户端接收到这个数组 我用以下代码接收:
var Tp: Array of Byte;
i: Integer;
begin
i := ClientSocket.Socket.ReceiveLength;
if i <> 0 then
begin
SetLength(Tp,i);
ClientSocket.Socket.ReceiveBuf(Tp,i); //此时TP接收到的东西都是0x00
end;
.........
end;而将程序改写成这样:
var Tp: Array[1..3] of Byte; //假设对方发来的数据一定是3字节
i: Integer;
begin
i := ClientSocket.Socket.ReceiveLength;
if i <> 0 then
begin
ClientSocket.Socket.ReceiveBuf(Tp,3); //此时的TP正好是主机发来的数据
end;
.........
end;
用setlength动态设置接收缓冲区长度和采用定长得到的数据不同,奇怪啊!!
与此相关,同理..
STRING与静态CHAR数组内存分配区别原理是同上类似的..
变你是变长数组时,
var Tp: Array of Byte;
bufsize:integer;
rsize:integer;
bufsize:=3000;//这大小并不太重要. rsize:=ClientSocket.Socket.ReceiveBuf(Tp,bufsize);
改成
rsize:=ClientSocket.Socket.ReceiveBuf(pbyte(Tp)^,bufsize); //
2,必须取到返回参数(实际传输长度)加以判断.
~~~~~~\这是实际读取的长度。
可能不同取值对传输效率有细微影响,(可以根据自己程序网络情况进行测试)
但对通讯可靠性并没有区别.写得稍完整些,比如象下面这样...这种方式仅限非阻塞SOCKET..var
sBuf:string;
iSize:integer;
fo:TMemoryStream;
begin
......
.....
fo:=TMemoryStream.Create;
SetLength(sBuf,2000); iSize:=Socket.ReceiveBuf(pchar(sBuf)^,2000);
while iSize>0 do
begin
fo.Write(pchar(sBuf)^,iSize)
end;
.....