IPv6 TCP клиент, address is not valid in its conte

 
0
 
C++
ava
Aoizora | 14.12.2016, 22:05
У меня есть клиент и сервер для протокола IPv6. Я хочу подключить клиента к серверу, но у меня не получается. Возникает ошибка The requested address is not valid in its context. В чем здесь проблема? Я погуглил примеры кода и нашел их совсем немного, но в них подключение к серверу выполняется как у меня.


#include <ws2tcpip.h>
#include <Windows.h>
#include <stdio.h>
#include "ip.h"

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

#define REMOTE_HOST "::1"
#define REMOTE_PORT 666
#define PACKET_SIZE 0x1000

void WINAPI FormatError(DWORD errCode);
DWORD WINAPI HandleConnection(SOCKET sock);
SOCKET WINAPI ConnectToProxy(char *ip);
BOOL WINAPI RecvPacket(SOCKET sock, DWORD *dwBytesRead);
void WINAPI PrintIpHeader (char* buffer);
void WINAPI PrintTcpPacket(char* buffer, int size);
void WINAPI PrintUdpPacket(char *buffer, int size);
void WINAPI PrintIcmpPacket(char* buffer, int size);
void WINAPI PrintData (char* data , int size);
void WINAPI PrintPacket(char* buffer, int size);

int main(int argc, char *argv[])
{
    WSADATA wsadata;
    SOCKET server;

    if (FAILED(WSAStartup(MAKEWORD(2, 2), &wsadata)))
    {
        goto _end;
    }

    // Адрес прокси, к которому подключается, задается как константа
    // или берется из первого командной строки
    // Закомментировать/раскомментировать нужную строку
    //server = ConnectToProxy(argv[1]);
    server = ConnectToProxy(REMOTE_HOST);

    if (server != INVALID_SOCKET)
        HandleConnection(server);

_end:
    WSACleanup();
}

SOCKET WINAPI ConnectToProxy(char *ip)
{
    struct sockaddr_in6 remote_addr;
    SOCKET sock = INVALID_SOCKET;
    char ip6_addr_buf[100];


    sock = socket(AF_INET6, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET)
    {
        goto _end;
    }

    remote_addr.sin6_flowinfo = 0;
    remote_addr.sin6_family = AF_INET6;
    inet_pton(AF_INET6, ip, &remote_addr.sin6_addr);
    remote_addr.sin6_port = htons(REMOTE_PORT);
    if (connect(sock, (struct sockaddr *)&remote_addr, sizeof(remote_addr)) == SOCKET_ERROR)
    {
        inet_ntop(AF_INET6, &remote_addr.sin6_addr, ip6_addr_buf, sizeof(ip6_addr_buf));
        printf("Connection to %s port %u failed\n", ip6_addr_buf, remote_addr.sin6_port);
        FormatError(WSAGetLastError());
        closesocket(sock);
        sock = INVALID_SOCKET;
        goto _end;
    }

_end:
    return sock;
}

// Форматированный вывод ошибок.
// errCode - значение, возвращенное WSAGetLastError()
void WINAPI FormatError(DWORD errCode)
{
    char error[1000]; 
    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        errCode,
        MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
        error, sizeof(error), NULL);
    printf("\nError: %s\n", error);
}

// Получение пакета из сокета. buffer - куда считываем, dwBufSize - размер буфера,
// dwBytesRead - количество прочитанных байт
BOOL WINAPI RecvPacket(SOCKET sock, char *buffer, DWORD dwBufSize, DWORD *dwBytesRead)
{
    // Читаем данные
    int bytes_read = recv(sock, buffer, dwBufSize, 0);
    *dwBytesRead = (bytes_read > 0) ? bytes_read : 0;
    // Вернем успех или неудачу
    return (bytes_read > 0) ? TRUE : FALSE;
}

// Обработка соединения с прокси
DWORD WINAPI HandleConnection(SOCKET sock)
{
    char packet[PACKET_SIZE];
    DWORD dwBytesRead = 0;

    while (TRUE)
    {
        RecvPacket(sock, packet, PACKET_SIZE, &dwBytesRead);
        PrintPacket(packet, dwBytesRead);
    }
}
Kommentare (5)
ava
feodorv | 15.12.2016, 02:52 #
Цитата (Aoizora @  14.12.2016,  22:05 findReferencedText)
The requested address is not valid in its context. В чем здесь проблема?

Ну как Вам сказать. Вы когда-нибудь обращаете внимание на варнинги при компиляции? Мой Вам совет: выставить /W4 - четвертый уровень предупреждений, и не двигаться далее, пока при компиляции выдаётся хотя бы один варнинг.


По проблеме. С одной стороны:
Цитата (Aoizora @  14.12.2016,  22:05 findReferencedText)
SOCKET WINAPI ConnectToProxy(char *ip)
С другой стороны:
Цитата (Aoizora @  14.12.2016,  22:05 findReferencedText)
    server = ConnectToProxy(REMOTE_HOST);
Так по какому IP6 Вы цепляетесь к серверу???
ava
feodorv | 15.12.2016, 02:59 #
Что возвращает inet_pton()?
ava
Aoizora | 15.12.2016, 17:48 #
Возвращает 1.
ava
feodorv | 15.12.2016, 18:21 #
Маловероятно, но возможно, что inet_ntop() переустанавливает ошибку. Попробуйте сохранить ее, может, она совсем другая:
Цитата (Aoizora @  14.12.2016,  22:05 findReferencedText)
    if (connect(sock, (struct sockaddr *)&remote_addr, sizeof(remote_addr)) == SOCKET_ERROR)
  {
    DWORD errorCode = WSAGetLastError();
    inet_ntop(AF_INET6, &remote_addr.sin6_addr, ip6_addr_buf, sizeof(ip6_addr_buf));
    printf("Connection to %s port %u failed\n", ip6_addr_buf, remote_addr.sin6_port);
    FormatError(errorCode);
    closesocket(sock);
    sock = INVALID_SOCKET;

ava
Aoizora | 15.12.2016, 19:21 #
Сделал так. Все равно ошибка выводится та же, что и в заголовке темы.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden