Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IPv6 TCP клиент, address is not valid in its conte 
:(
    Опции темы
Aoizora
Дата 14.12.2016, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.11.2016

Репутация: нет
Всего: нет



У меня есть клиент и сервер для протокола 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);
    }
}

PM MAIL   Вверх
feodorv
Дата 15.12.2016, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Что возвращает inet_pton()?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Aoizora
Дата 15.12.2016, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.11.2016

Репутация: нет
Всего: нет



Возвращает 1.
PM MAIL   Вверх
feodorv
Дата 15.12.2016, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Маловероятно, но возможно, что inet_ntop() переустанавливает ошибку. Попробуйте сохранить ее, может, она совсем другая:
Цитата(Aoizora @  14.12.2016,  22:05 Найти цитируемый пост)
    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;




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Aoizora
Дата 15.12.2016, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.11.2016

Репутация: нет
Всего: нет



Сделал так. Все равно ошибка выводится та же, что и в заголовке темы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1195 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.