gpt4 book ai didi

Delphi winsock为什么在分配InAddr.S_addr时sockaddr_in值得到 "garbled"

转载 作者:行者123 更新时间:2023-12-03 15:52:05 35 4
gpt4 key购买 nike

我找到了一个函数来测试远程 PC 上的特定 tcp 端口是否打开。它看起来工作正常,但是当我为变量 client.sin_addr.S_addr 分配一个值时,其他值似乎被分配了乱码,至少我没想到会看到这样的值我所看到的。

分配client.sin_addr.S_addr之前的客户端记录值:

(2, 39173, ((#0, #0, #0, #0), (0, 0), 0), (#0, #0, #0, #0, #0, #0, #0, #0), 2, (#5, '™', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0))

分配client.sin_addr.S_addr后的客户端记录值:

(2, 39173, (('À', '¨', #10, 'h'), (43200, 26634), 1745529024), (#0, #0, #0, #0, #0, #0, #0, #0), 2, (#5, '™', 'À', '¨', #10, 'h', #0, #0, #0, #0, #0, #0, #0, #0))

请注意,1745529024 是 IP 地址 192.168.10.104 的正确表示。

据我所知,该函数按预期工作。我只是不喜欢那些乱码。

这是正常现象吗?我应该担心还是忽略它?

function PortTCP_IsOpen(dwPort : Word; InetAddress : AnsiString) : boolean;
var
client : sockaddr_in;
sock : Integer;

GInitData: TWSAData;
ret : Integer;
res : integer;
msg : string;
begin
Result:=False;
ZeroMemory(@client, SizeOf(client));

ret := WSAStartup($0002, GInitData); //initiates use of the Winsock DLL
if ret <> 0 then RaiseLastOSError;
try
client.sin_family := AF_INET; //Set the protocol to use , in this case (IPv4)
client.sin_port := htons(dwPort); //convert to TCP/IP network byte order (big-endian)
// before value
client.sin_addr.S_addr := inet_addr(PAnsiChar('192.168.10.104')); //inet_addr(PAnsiChar(ansistring(GetIPFromHost(InetAddress)))); //convert to IN_ADDR structure
// after value
sock := socket(AF_INET, SOCK_STREAM, 0); //creates a socket
Result:= connect(sock, client, SizeOf(client)) = 0; //establishes a connection to a specified socket
if Result then
begin
if not closesocket(sock) = 0 then
begin
res := WSAGetLastError;
msg := SysErrorMessage(res);
raise Exception.CreateFmt('%s Code:%d',[msg, res]);
end;
end else
begin
res := WSAGetLastError;
msg := SysErrorMessage(res);
raise Exception.CreateFmt('%s Code:%d',[msg, res]);
end;
finally
WSACleanup;
end;
end;

最佳答案

这些字段被声明为保存 Char 值,因此调试器会以这种方式解释它们并尝试显示字符。当然,它们并不是真正的字符,但调试器并不了解更多。

十进制值1745529024是十六进制0x680AA8C0。最高有效字节是 0x68,当解释为 ASCII 字符时,它是小写的 h。值 0x0A 是一个换行符,表示为 Delphi 字 rune 字 #10。等等。

关于Delphi winsock为什么在分配InAddr.S_addr时sockaddr_in值得到 "garbled",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28460033/

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