无法连接到服务器(通过远程连接)

时间:2013-10-07 16:27:11

标签: c++ winsock

我已经在这个项目上工作了一段时间,想要通过远程连接测试一些新功能,但客户端无法连接(虽然它能够在过去连接)。一切都在当地很好。目前我无法移动foward所以我正在使用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
    }
}

1 个答案:

答案 0 :(得分: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。