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

标签 delphi sockets encoding character recv

我最近将 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/

相关文章:

c++ - 分析波头

java - 如何将 Java 图像转换为 JPEG 字节数组?

sql - 在 Delphi 字符串中添加引号字符

delphi - 获取 EDBEngineError - 操作不适用于 Delphi XE2 中的 ExecSQL 语句

Delphi Frame继承的属性不存在

java - 具有多个待办事项的服务器套接字如何工作?

delphi - 突触:无法从套接字接收数据

c++ - select() 总是返回 0

c - recv() - 使用 HTTP header

node.js - 使用请求的nodejs编码