无法使用外部IP连接到我的Winsock服务器

时间:2019-02-01 10:40:42

标签: networking tcp winsock winsock2

当我尝试使用localhost IP或LAN IP连接到服务器时,一切正常,客户端成功连接。

一旦我尝试使用外部IP连接到服务器,问题就开始了-我只收到WSAETIMEDOUT错误,然后服务器看不到任何传入的连接。

Canyouseeme.org返回:

Error: I could not see your service on <my IP> on port (12345)
Reason: Connection timed out

当我尝试ping我的外部IP时也会发生同样的事情-我只得到Request timed out

我禁用了我的防火墙,路由器的防火墙,添加了NAT规则,但是仍然出现相同的错误。

我的客户代码(已缩短):

SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(serverSocket == INVALID_SOCKET)
{
    printf("socket() failed with code %d\n", WSAGetLastError());

    return;
}

ZeroMemory(&serverSockAddrIn, sizeof(serverSockAddrIn));

serverSockAddrIn.sin_family = AF_INET;
inet_pton(AF_INET, "<My external IP>", &serverSockAddrIn.sin_addr.S_un.S_addr);
serverSockAddrIn.sin_port = htons(12345);

if(connect(serverSocket, (sockaddr*)&serverSockAddrIn, sizeof(serverSockAddrIn)) == SOCKET_ERROR)
{
    printf("connect() failed with code %d\n", WSAGetLastError());

    closesocket(serverSocket);

    return;
}

以及我服务器的代码(也缩短了):

SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(serverSocket == INVALID_SOCKET)
{
   printf("socket() failed with code %d\n", WSAGetLastError());

   return;
}

sockaddr_in serverSockAddrIn;

ZeroMemory(&serverSockAddrIn, sizeof(serverSockAddrIn));

serverSockAddrIn.sin_family = AF_INET;
serverSockAddrIn.sin_port = htons(12345);
serverSockAddrIn.sin_addr.S_un.S_addr = INADDR_ANY;

if(bind(serverSocket, (sockaddr*)&serverSockAddrIn, sizeof(serverSockAddrIn)) == SOCKET_ERROR)
{
   printf("bind() failed with code %d\n", WSAGetLastError());

   closesocket(serverSocket);

   return;
}

if(listen(serverSocket, SOMAXCONN) == SOCKET_ERROR)
{
   printf("listen() failed with code %d\n", WSAGetLastError());

   closesocket(serverSocket);

   return;
}

SOCKET clientSocket;

while((clientSocket = accept(serverSocket, NULL, NULL)) == INVALID_SOCKET)
   printf("accept() failed with code %d\n", WSAGetLastError());

printf("Client connected\n");

无论服务器是否在运行,客户端的connect()都会不断返回10060 => WSAETIMEDOUT

由于客户端无法连接,服务器调用accept()并阻止。

注意:如果有必要,我可以在同一台计算机上运行这两个应用程序。

你知道我做错了什么吗

0 个答案:

没有答案
相关问题