gpt4 book ai didi

debugging - Winsock 的 connect() 永久返回 WSAETIMEDOUT,但 PuTTY 连接在同一个端口

转载 作者:可可西里 更新时间:2023-11-01 02:33:08 25 4
gpt4 key购买 nike

可能是迄今为止我遇到的最奇怪的错误。

我需要连接到某些在 Windows XP Embedded 下运行的第 3 方应用程序。网络连接存在并有效:我能够使用在 Windows XP SP3 上运行的 PuTTY 连接到预期的端口并执行一些类似 telnet 的操作。现在,我的应用程序是一个非常简单的 C (VC++ 2008) 程序:

int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData = { 0 };
if (SOCKET_ERROR == WSAStartup(MAKEWORD(2, 0), &wsaData))
return Error("Failed to initialize sockets.");

SOCKET client = INVALID_SOCKET;

const char *pserver = "172.22.1.3";

client = socket(AF_INET, SOCK_STREAM, 0);

if (INVALID_SOCKET != client)
{
sockaddr_in s = { 0 };
s.sin_family = AF_INET;
s.sin_port = htons(4799);
hostent *e = gethostbyname(pserver);
memmove(&s.sin_addr, e->h_addr, e->h_length);

std::cout << "Connecting to: " << pserver << std::endl;

if (SOCKET_ERROR != connect(client, (sockaddr*)&s, sizeof(s)))
{
std::cout << "Successfully connected." << std::endl;
}
else
std::cout << "Can't connect: " << WSAGetLastError() << std::endl;
}

getchar();

if (INVALID_SOCKET != client)
closesocket(client);

return 0;
}

每次我编译和运行这个程序时,我都会收到 WSAETIMEDOUT 错误。感到困惑,我开始深入挖掘并在接收方生成两个 Wireshark 转储 - 一个使用 PuTTY,另一个使用我的应用程序,从同一台 PC 运行并连接到同一台设备(下面的第一个 SYN 数据包)。

腻子:

No.     Time        Source                Destination           Protocol Info
1 0.000000 172.22.1.61 172.22.1.3 TCP atc-lm > 4799 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=0 TSV=0 TSER=0

Frame 1 (78 bytes on wire, 78 bytes captured)
Ethernet II, Src: Dell_b8:4a:31 (00:26:b9:b8:4a:31), Dst: EEPD_96:04:48 (00:e0:33:96:04:48)
Internet Protocol, Src: 172.22.1.61 (172.22.1.61), Dst: 172.22.1.3 (172.22.1.3)
Transmission Control Protocol, Src Port: atc-lm (1170), Dst Port: 4799 (4799), Seq: 0, Len: 0

0000 00 e0 33 96 04 48 00 26 b9 b8 4a 31 08 00 45 00 ..3..H.&..J1..E.
0010 00 40 04 a1 40 00 80 06 9b aa ac 16 01 3d ac 16 .@..@........=..
0020 01 03 04 92 12 bf 9a 99 fc ec 00 00 00 00 b0 02 ................
0030 ff ff 2c bd 00 00 02 04 05 b4 01 03 03 00 01 01 ..,.............
0040 08 0a 00 00 00 00 00 00 00 00 01 01 04 02 ..............

我的申请:

No.     Time        Source                Destination           Protocol Info
1 0.000000 Dell_b8:4a:31 EEPD_96:04:48 FC [Malformed Packet]

Frame 1 (78 bytes on wire, 78 bytes captured)
Ethernet II, Src: Dell_b8:4a:31 (00:26:b9:b8:4a:31), Dst: EEPD_96:04:48 (00:e0:33:96:04:48)
MDS Header(Unknown(0)/Unknown(0))
[Malformed Packet: FC]

0000 00 e0 33 96 04 48 00 26 b9 b8 4a 31 00 00 00 00 ..3..H.&..J1....
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020 00 00 00 00 00 00 00 00 6d 8b 00 00 00 00 b0 02 ........m.......
0030 ff ff 90 73 00 00 02 04 05 b4 01 03 03 00 01 01 ...s............
0040 08 0a 00 00 00 00 00 00 00 00 01 01 04 02 ..............

基本上,整个 IP 负载都被删除为 0x00 而不是有效字节。

最奇怪的部分来了。我为 .NET 3.5 写了一个类似的程序:

static void Main(string[] args)
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Unspecified);
socket.Connect("172.22.1.3", 4799);

Console.WriteLine("Connected");

Console.ReadLine();
socket.Disconnect(true);
}

相同的 Windows XP SP3 PC,相同的网络连接 - 我的 .NET 应用程序只是连接到远程应用程序!此外,我原来的 C 应用程序在 Windows 7 x64 下的另一台笔记本电脑上工作得很好。在戴了一整天的头带后,我有两台 Windows XP SP3 笔记本电脑,我的 C 应用程序无法连接到远程客户端,还有一台 Windows XP SP3 和一台 Windows 7 x64 笔记本电脑,我的 C 应用程序可以正常运行。

我的第一个猜测是网络驱动程序,但 PuTTY 和 .NET 应用程序只能在同一台笔记本电脑上运行!

有没有人经历过类似的事情并可以给我建议?

谢谢。

最佳答案

这对我来说不对:

memmove(&s.sin_addr, e->h_addr, e->h_length);
^^^^^^^^^-- here

无法访问 VC 文档,但它不应该是 &e->h_addr 吗?

只是一个 W.A.G.由于您的版本的 IP block 已清零,按理说 memmove 从错误的位置读取并复制了一 block 未使用但已清零的内存。

关于debugging - Winsock 的 connect() 永久返回 WSAETIMEDOUT,但 PuTTY 连接在同一个端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3348972/

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