не могу подключиться к моему серверу winsock с другого компьютера, используя мой IP-адрес - PullRequest
0 голосов
/ 06 октября 2019

я работаю в чате.

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

, у меня порт переадресован в моем маршрутизаторе следующим образом:

external host: my ip
internal host: my internal ip i got with ipconfig (192.168.1.4)
internal port: 54444
external port: 54444

даже тогда, я думаю, что я все еще смогу подключитьсяна мой IP-адрес без перенаправления портов, так как сервер размещен на 127.0.0.1/localhost, верно?

это мой код клиента:

WSADATA wsa;
    if (!WSAStartup(MAKEWORD(2, 2), &wsa))
    {
        printf("started server\n");
        SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
        if (listen_sock)
        {
            printf("created listen socket\n");

            sockaddr_in addr;
            addr.sin_family = AF_INET;
            inet_pton(AF_INET, "92.83.235.216", &addr.sin_addr);
            addr.sin_port = htons(54444);

            if (!connect(listen_sock, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)))
            {
                printf("connected to server\n");

                char buffer[2048];
                char input[2048];

                for(;;)
                {
                    printf("message: ");
                    scanf_s("%s", input);

                    if (send(listen_sock, input, strlen(input) + 1, 0))
                    {
                        printf("\nsent message \"%s\"", input);
                    }

                    memset(input, 0, sizeof(input));
                    printf("\n");
                }
            }
        }
    }

    printf("%d\n", WSAGetLastError());

    WSACleanup();

он останавливается после того, как показывает "создание прослушивания"socket ", прямо при вызове connect ()

Есть идеи?

РЕДАКТИРОВАТЬ: серверный код сильно перемешан из-за того, что я превратил его в класс, чтобы его было проще использовать + добавление потокадля обработки нескольких соединений, но, как я уже сказал, он работает внутри

. Единственное, что отличается в коде сервера, кроме вызовов listen и accept, я добавил следующие правила:

char opt_val = 1;
setsockopt(this->m_listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof(opt_val));
setsockopt(this->m_listen_sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, sizeof(opt_val));

1 Ответ

0 голосов
/ 07 октября 2019

То, что вы описываете, звучит так, как ваши SYN пакеты отбрасываются (SYN ... нет SYN/ACK или RST). Вы можете использовать wireshark , чтобы увидеть, что происходит с фактическим TCP-соединением (фильтр по порту).

Возможно, вы захотите устранить сервер как источник ошибки, прослушивая localhostи соединяя таким образом. Вы можете проверить, прослушивает ли он правильный адрес и порт, используя netstat.

В противном случае, это поможет, если вы отправите свой код сервера.

...