Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2016, 20:17   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию IPv6 TCP клиент, address is not valid in its context

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

inet_pton() возвращает 1 и не переустанавливает last error.
Aoizora вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
протокол TCP/IPv6 вялое развитие oldsnowman Свободное общение 15 01.06.2016 17:36
tcp/ip клиент Сержикк C/C++ Сетевое программирование 1 05.07.2015 13:49
MediaPlayer.create(Context context, Uri uri) - какой Context? motorway Мобильные ОС (Android, iOS, Windows Phone) 14 12.07.2013 01:16
TCP/IP клиент -сервер zhenya.ya C/C++ Сетевое программирование 10 05.03.2011 22:01
как создать TCP клиент, TCP сервер ? DreamMaster911 C/C++ Сетевое программирование 1 26.10.2010 15:05