1

我已经在这个项目上工作了一段时间,想通过远程连接测试一些新功能,但是客户端无法连接(虽然它过去能够连接)。在本地一切正常。目前我无法移植,所以我正在使用 hamachi。我试过用wireshark捕获hamachi网络流量,客户端请求确实到达了,但服务器没有收到它们。

任何帮助是极大的赞赏。

代码(省略了错误检查以使代码更具可读性):

客户:

   addrinfo ADDRESSINFO, *CLIENTINFO=NULL;

   ZeroMemory(&ADDRESSINFO, sizeof(ADDRESSINFO));
   ADDRESSINFO.ai_family = AF_INET;
   ADDRESSINFO.ai_socktype = SOCK_STREAM;
   ADDRESSINFO.ai_protocol = IPPROTO_TCP;

   ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

   getaddrinfo(strIP.c_str(), strPort.c_str(), &ADDRESSINFO, &CLIENTINFO);

   connect(ConnectSocket, CLIENTINFO->ai_addr, CLIENTINFO->ai_addrlen);

   freeaddrinfo(CLIENTINFO);

服务器:

addrinfo ADDRESSINFO, *SERVERINFO=NULL;

ZeroMemory(&ADDRESSINFO, sizeof(ADDRESSINFO));

ADDRESSINFO.ai_family = AF_INET;
ADDRESSINFO.ai_socktype = SOCK_STREAM;
ADDRESSINFO.ai_protocol = IPPROTO_TCP;

getaddrinfo(SERVER_IP, SERVER_PORT, &ADDRESSINFO, &SERVERINFO);

ListenSocket = socket(SERVERINFO->ai_family, SERVERINFO->ai_socktype, SERVERINFO->ai_protocol);
ConnectionSocket = socket(SERVERINFO->ai_family, SERVERINFO->ai_socktype, SERVERINFO->ai_protocol);

bind(ListenSocket, SERVERINFO->ai_addr, SERVERINFO->ai_addrlen);

freeaddrinfo(SERVERINFO);

listen( ListenSocket, SOMAXCONN )

while(true)
{
    if(ConnectionSocket = accept(ListenSocket, NULL, NULL))
    {
                  //do stuff
    }
}
4

1 回答 1

1

我不知道您粘贴的代码有多精简,但是:

1) There is no place where you set destination address
2) There is no place you set destination port
3) To which port is server trying to bind?

...所以这根本行不通。此外,请处理错误 - (是的,您说您故意省略了它们)但我敢打赌,如果服务器拒绝连接,您的错误处理表明了这一点。否则它连接得很好,但你声称否则。你还说:

1) 'the client failed to connect'
2) and later you say 'the client requests do arrive, but the server doesn't receive them'

如果您能够连接 - 您应该会看到 3 次握手(TCP 流连接)。如果不是错误处理,wireshark 会显示。您说客户端请求确实到达,但您的代码没有发送任何内容(没有可用的发送代码)。您还说服务器没有收到它们 - 如果它连接并且您发送任何内容,那么您的错误处理不会显示任何内容并且服务器没有收到任何内容(但服务器代码缺少任何接收例程调用)。

我认为现在你无法在这方面得到太多帮助。更新您的代码,验证它是否真的在本地工作(您的意思是这里的环回对吗?),然后测试“不在本地”,添加错误处理并在客户端和服务器端使用wireshark。

于 2013-10-07T20:30:03.733 回答