아마 지금까지 만난 가장 이상한 버그 일 것입니다.Winsock의 connect()는 WSAETIMEDOUT을 영구적으로 반환하지만 PuTTY는 동일한 포트에 연결합니다.
Windows XP Embedded에서 실행되는 타사 응용 프로그램에 연결해야합니다. 네트워크 연결 현재 및 작동 : Windows XP SP3에서 실행중인 PuTTY를 사용하여 예상 포트에 연결하고 일부 텔넷과 같은 작업을 수행 할 수 있습니다. 자, 내 응용 프로그램은 매우 간단한 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 [email protected]@........=..
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 페이로드 대신 유효한 바이트 × 00로 닦아되고있다.
이제 가장 이상한 부분이 있습니다. 나는 .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에서 다른 랩톱에서 정상적으로 작동합니다. 하루 종일 헤드 밴드를 사용하면 C 응용 프로그램이 원격 클라이언트에 연결되지 않는 두 개의 Windows XP SP3 랩톱과 C 응용 프로그램이 문제없이 작동하는 Windows XP SP3 및 Windows 7 x64 랩톱이 각각 하나씩 있습니다.
첫 번째 추측은 네트워크 드라이버 였지만 PuTTY 및 .NET 응용 프로그램은 동일한 랩톱에서 작동합니다!
다른 누구도 exerienced 뭔가 내게 조언을 해줄 수 있었습니까?
감사합니다.
불행히도, 그 중 하나가 작동하지 않았다. 뿐만 아니라 getaddrinfo(). – wasker
점으로 구분 된 쿼드 변환은 gethostbyname()의 알려진 지원 기능입니다. 점으로 구분 된 쿼드 (quad)가 있음을 알 때 inet_addr()을 호출하는 것이 더 효율적입니다. –
잘못된 포인터 또는 바이트 길이를 사용하여 메모리가 손상되는 경우를 대비하여 memmove()에 대한 호출을 제거하려고했습니다. –