gpt4 book ai didi

delphi - 在 Delphi XE5 中使用 Socket Recv 方法

转载 作者:行者123 更新时间:2023-12-02 01:12:13 24 4
gpt4 key购买 nike

我最近将 Delphi 7 IDE 更改为 Delphi XE5(重大变化)。我正在开发一个小型客户端/服务器应用程序,并且在尝试读取字符串时遇到问题。

我的代码:

Function TIOHandler.readString(Var data: String): Integer;
Var
byteReceived: Integer;
buff: Array Of Char;
Begin
byteReceived := 0;
Result := 0;
SetLength(buff, 255);

byteReceived := self.readBuffer(buff[0], SizeOf(buff));

If (byteReceived > 0) Then
Begin
SetLength(data, SizeOf(buff));
lstrcpyn(@data[1], @buff[0], SizeOf(buff));
Result := byteReceived;
End
Else If byteReceived = SOCKET_ERROR Then
Result := SOCKET_ERROR;
End;

Function TIOHandler.readBuffer(Var buffer; bufferSize: Integer): Integer;
Begin
Result := recv(self.ioSocket.aSock, buffer, bufferSize, 0);
End;

我得到了罕见的符号,看起来是字符编码问题。谁能告诉我我哪里错了。

致以诚挚的问候。

最佳答案

  1. 不要使用字符数组作为缓冲区,使用“字节数组”而不是“字符数组”,它会自动使您的代码独立于字符大小。或者,您可以对二进制数据使用 RawBinaryString 类型。

  2. SizeOf(buff) 是指针的大小(4 或 8 个字节,具体取决于目标),您应该使用类似“Length(buff)*SizeOf(buff[0])”的内容

  3. 不要忘记,在新的 Delphi 编译器中,char 的大小默认为 2,强烈建议阅读有关 Delphi 中的 char/string 类型的内容。

更新:您可以转换 String<->RawBinaryString 例如,如下所示:

function BinToString(const s: RawByteString): String;
begin
assert(length(s) mod SizeOf(result[1])=0);
setlength(result, length(s) div SizeOf(result[1]));
move(s[1], result[1], length(result)*SizeOf(result[1]));
end;

function StringToBin(const s: String): RawByteString;
begin
setlength(result, length(s)*SizeOf(s[1]));
move(s[1], result[1], length(result));
end;

关于delphi - 在 Delphi XE5 中使用 Socket Recv 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19347698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com