Я не могу получить доступ к своему серверу winsock с другого компьютера (но localhost работает) - PullRequest
2 голосов
/ 09 июля 2019

Я не могу подключиться к своему серверу winsock (tcp / ip) с другого компьютера, но на локальном хосте я могу использовать putty. На машине, которую я использую, работает Linux, и я использую замазку для подключения к своему серверу. Я не знаю, не могу ли я подключиться, потому что мой компьютер работает под управлением Linux или я допустил ошибку в своем коде, поэтому мне нужна ваша помощь.

server.cpp

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <string>

#pragma comment(lib, "ws2_32.lib")

int main()
{
    std::cout << "--- Tcp/ip Server ---" << std::endl;
    WSADATA wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);

    SOCKET server = socket(AF_INET, SOCK_STREAM, 0);
    if (server == INVALID_SOCKET)
    {
        std::cout << "error in SOCKET(): "<< WSAGetLastError() << std::endl;
        WSACleanup();
    }
    sockaddr_in s;
    s.sin_family = AF_INET;
    s.sin_addr.s_addr = INADDR_ANY;
    s.sin_port = htons(52000);

    // bind
    if (bind(server, (sockaddr*)&s, sizeof(s)) == SOCKET_ERROR)
    {
        std::cout << "Error: bind()" << std::endl;
    }
    //listen
    if (listen(server, SOMAXCONN) == SOCKET_ERROR)
    {
        std::cout << "Error in listen(): " << WSAGetLastError() << std::endl;
        WSACleanup();
    }
    sockaddr_in from;
    int fromlen = sizeof(from);
    // accept
    SOCKET client = accept(server, (SOCKADDR*)&from, &fromlen);
    if (client == INVALID_SOCKET)
    {
        std::cout << "Error in accept(): " << WSAGetLastError << std::endl;
        WSACleanup();
    }
    else
    {

        char clientIp[17];
        if (inet_ntop(AF_INET, &from.sin_addr, clientIp, 17) == NULL)
        {
            std::cout << "Can't get the client's ip: " << WSAGetLastError() << std::endl;
        }

        std::cout << "ip connected: " << clientIp << std::endl;
    }
    char recvbuf[512];
    do
    {
        int iResult = recv(client, recvbuf, 512, 0);
        if (iResult > 0)
        {
            send(client, recvbuf, iResult, 0);
        }


    } while (true);
    return 0;
}
...