Почему не простое гнездо для подключения к локальному хосту? - PullRequest
1 голос
/ 26 ноября 2011

Я следую руководству, которое учит меня, как использовать win32 сокеты (winsock2).Я пытаюсь создать простой сокет, который подключается к «localhost», но моя программа не работает, когда я пытаюсь подключиться к локальному хосту (с помощью функции connect ()).

Нужны ли мне права администратора дляподключиться к локальному хосту?Может быть, поэтому он терпит неудачу?Может быть, есть проблема с моим кодом?Я пробовал порты 8888 и 8000, и они оба не работают.

Также, если я изменю порт на 80 и подключусь к www.google.com, я могу подключиться, НО я не получаю ответ.Это потому, что я не отправил HTTP-запрос или мне нужно получить ответ?

Вот мой код (с удаленными включениями):

// Constants & Globals //
typedef unsigned long IPNumber;    // IP number typedef for IPv4
const int SOCK_VER    = 2;
const int SERVER_PORT = 8888;  // 8888
SOCKET mSocket        = INVALID_SOCKET;
SOCKADDR_IN sockAddr  = {0};
WSADATA wsaData;
HOSTENT* hostent;


int _tmain(int argc, _TCHAR* argv[])
{
    // Initialise winsock version 2.2
    if (WSAStartup(MAKEWORD(SOCK_VER,2), &wsaData) != 0)
    {
        printf("Failed to initialise winsock\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    if (LOBYTE(wsaData.wVersion) != SOCK_VER || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("Failed to load the correct winsock version\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    // Create socket
    mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (mSocket == INVALID_SOCKET)
    {
        printf("Failed to create TCP socket\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }


    // Get IP Address of website by the domain name, we do this by contacting(??) the Domain Name Server
    if ((hostent = gethostbyname("localhost")) == NULL)  // "localhost"  www.google.com
    {
        printf("Failed to resolve website name to an ip address\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    sockAddr.sin_port             = htons(SERVER_PORT);
    sockAddr.sin_family           = AF_INET;
    sockAddr.sin_addr.S_un.S_addr = (*reinterpret_cast <IPNumber*> (hostent->h_addr_list[0]));
    // sockAddr.sin_addr.s_addr=*((unsigned long*)hostent->h_addr);  // Can also do this

    // ERROR OCCURS ON NEXT LINE: Connect to server
    if (connect(mSocket, (SOCKADDR*)(&sockAddr), sizeof(sockAddr)) != 0)
    {
        printf("Failed to connect to server\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    printf("Got to here\r\n");
    // Display message from server
    char buffer[1000];
    memset(buffer,0,999);
    int inDataLength=recv(mSocket,buffer,1000,0);
    printf("Response: %s\r\n", buffer);

    // Shutdown our socket
    shutdown(mSocket, SD_SEND);

    // Close our socket entirely
    closesocket(mSocket);

    // Cleanup Winsock
    WSACleanup();

    system("pause");
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 26 ноября 2011

Поскольку вы готовы использовать TCP-протокол, который основан на соединении , вам понадобится коммуникационный аналог, такой как приложение, прослушивающее порт 8888, чтобы ответить на ваш запрос на инициирование соединения ( SYN -Пакет в терминах TCP)

Вы можете использовать инструмент Unix netcat (который также доступен для других ОС), чтобы сделать это без необходимости прав администратора ...

nc -l 8888

... который открывает гнездо прослушивания на порту 8888 на вашем локальном компьютере

Однако в системах Unix вам не разрешено прослушивать так называемые хорошо известныепорты без прав администратора.

Для получения дополнительной информации прочитайте о жизненном цикле TCP-соединения

0 голосов
/ 03 октября 2013

Чтобы подключиться к порту TCP на локальном хосте, кто-то должен прослушивать этот порт на вашей машине.

Помимо написания собственного сервера, существует простой способ прослушивания некоторых программ: установите на свой компьютер функцию «Простые службы TCP / IP». Это даст вам сервер «Цитата дня» на 17-м порту, дневной сервер на 13-м порту, сервер Chargen на 19-м порту и эхо-сервер на 7-м порту.

Чтобы установить это, перейдите в «Программы и компоненты» или «Установка и удаление программ» или как там это называется в Windows, выберите «Включение или отключение функций Windows», найдите и установите «Простые службы TCPIP». "в списке.

0 голосов
/ 26 ноября 2011

Кто-то должен прослушивать порт, к которому вы подключаетесь. Попробуйте написать небольшую серверную программу, которая будет прослушивать входящие соединения. Если подключение успешно, очевидно, вы подключены к Google, но вам нужно отправить HTTP-запрос (из C? - это было бы трудно).

...