Невозможно подключиться к моему серверу winsock с помощью внешнего IP - PullRequest
0 голосов
/ 01 февраля 2019

Когда я пытаюсь подключиться к своему серверу, используя локальный IP-адрес или локальный IP-адрес, все работает нормально, и клиент успешно подключается.

Проблемы начинаются, когда я пытаюсь подключиться к серверу, используя свой внешний IP - IПолучите только ошибку WSAETIMEDOUT, и сервер не сможет увидеть никаких входящих соединений.

Canyouseeme.org возвращает:

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

То же самое происходит, когда я пытаюсь пропинговать свой внешний 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() и блокирует, так как клиент не может подключиться.

Примечание. Я запускаю оба приложения на одном компьютере, если это имеет значение.

Есть ли у васЕсть идеи, что я сделал не так?

...