Mik*_*keA 0 delphi indy udpclient
谢谢您的帮助.
我正在将旧版本的Delphi转换为XE5,而我正困在Indy组件中.需要使用IdUDPClient.ReceiveBuffer
这是我的代码:
while not Terminated do
begin
try
lenUDP:= IdUDPClient.ReceiveBuffer(myBuf, buffLength, -1 );
if lenUDP<> 0 then
Synchronize(ReceivedLine);
except
Terminate;
end;
end;
Run Code Online (Sandbox Code Playgroud)
其中,myBuf = char数组[0 .. buffLength -1];
非常感谢所有帮助.
谢谢,
麦克风
正如我在评论中告诉你的上一个问题:
你也必须使用
TIdBytes它.用于SetLength()将其预分配到所需的大小,然后ReceiveBuffer()使用它进行调用,然后您可以根据需要直接或使用来复制数据BytesToRaw().
例如:
private
myBuf: TIdBytes;
...
while not Terminated do
begin
try
SetLength(myBuf, buffLength);
lenUDP := IdUDPClient.ReceiveBuffer(myBuf, -1);
if lenUDP > 0 then
begin
SetLength(myBuf, lenUDP);
Synchronize(ReceivedLine);
end;
except
Terminate;
end;
end;
Run Code Online (Sandbox Code Playgroud)
由于您的原始缓冲区是一个数组Char,并且您的处理函数已命名ReceivedLine(),因此我假设您的数据本质上是文本的.如果这是真的,你可以使用BytesToString()或(T|I)IdTextEncoding.GetString()到转换TIdBytes到String,如果这是ReceivedLine()使用myBuf的,例如:
S := BytesToString(myBuf{, en8bit});
Run Code Online (Sandbox Code Playgroud)
S := BytesToString(myBuf, 0, lenUDP{, en8bit});
Run Code Online (Sandbox Code Playgroud)
S := IndyTextEncoding_8bit.GetString(myBuf);
Run Code Online (Sandbox Code Playgroud)
S := IndyTextEncoding_8bit.GetString(myBuf, 0, lenUDP);
Run Code Online (Sandbox Code Playgroud)
可以使用该印地支持任何字符集编码,或者通过各种en...(),Indy...Encoding()或IndyTextEncoding...()在功能IdGlobal单元,或者CharsetToEncoding()在功能IdGlobalProtocols单元.
更新:由于您的缓冲区是其中包含union的记录的一部分,因此您必须使用局部TIdBytes变量:
type
myRecord = record
...
myBuf: array[0..buffLength-1] of Byte;
...
end;
...
private
myRec: myRecord;
...
var
udpBuf: TIdBytes;
...
SetLength(udpBuf, buffLength);
while not Terminated do
begin
try
lenUDP := IdUDPClient.ReceiveBuffer(udpBuf, -1);
if lenUDP > 0 then
begin
BytesToRaw(udpBuf, myRec.myBuf[0], lenUDP);
Synchronize(ReceivedLine);
end;
except
Terminate;
end;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2592 次 |
| 最近记录: |