Программирование сокетов с помощью MFC

Есть ли поддержка программирования сокетов Ipv6 с помощью MFC чтобы мы могли подключиться к серверу, имеющему адрес Ipv6, с помощью базовых классов Microsoft? Я прочитал эту ссылку, но мне это не сильно помогает.

спасибо, на самом деле у меня есть одно приложение MFC, работающее нормально с ipv4, но я хочу использовать Ipv6 в том же приложении. Возможно ли это ???

Akanksha Varshney 26.07.2018 13:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
506
2

Ответы 2

CAsyncSocket действительно поддерживает IPv6. Для этого есть несколько способов:

  • ConnectEx
  • BindEx
  • ReceiveFromEx
  • SendToEx
  • GetSockNameEx
  • GetPeerNameEx

Однако я бы предложил напрямую использовать Winsock 2 API.

спасибо, я не получил метод ConnectEd, не могли бы вы поделиться мне ссылкой

Akanksha Varshney 26.07.2018 13:40

@AndrewKomiagin нет упоминания о ConnectEx() или BindEx() в документация, но есть перегрузки Connect() и Bind(), которые принимают SOCKADDR* в качестве входных данных. Это то, что ты имеешь в виду?

Remy Lebeau 26.07.2018 19:11

@AndrewKomiagin Я использовал ConnectEx () для подключения по методу ipv6. Я получаю этот код ошибки 10047 «Семейство адресов не поддерживается семейством протоколов». Пожалуйста, подтвердите, что эта функция работает или нет для ipv6.

Akanksha Varshney 27.07.2018 10:21

Приведите минимальный пример. Вы инициализировали winsock?

Andrew Komiagin 27.07.2018 11:03

Я инициализировал winsock, но по-прежнему эта ошибка 10047: - «Был использован адрес, несовместимый с запрошенным протоколом. Все сокеты создаются со связанным семейством адресов (то есть AF_INET для интернет-протоколов) и общим типом протокола (то есть SOCK_STREAM ) "это означает, что AF_INET6 нельзя использовать

Akanksha Varshney 27.07.2018 12:46

Взгляните на реализацию сокета filezilla. Он использует тот же интерфейс, что и CAsyncSocket. github.com/baloonwj/filezilla/tree/master/…

Andrew Komiagin 27.07.2018 13:04

Я не мог вам помочь, так как вы не привели ничего, даже минимального примера. То, как вы инициализируете слой сокетов, создаете / подключаетесь и т. д.

Andrew Komiagin 27.07.2018 13:05

@Andrew Komiagin я выложил код для клиентской части

Akanksha Varshney 31.07.2018 07:46

Код здесь работает для меня:

LPCTSTR lpszHost = L"::1"; 
CSocket socket; 
int nPort = 1234;
ADDRINFOT addrInfo;
memset( &addrInfo, 0, sizeof( addrInfo ) );
addrInfo.ai_family = AF_INET6;
addrInfo.ai_socktype = SOCK_STREAM;

if ( socket.CreateEx( &addrInfo ) )
{
    struct sockaddr_in6 addr;
    memset( (LPVOID)&addr, 0, sizeof( addr ) );
    addr.sin6_family = AF_INET6;
    addr.sin6_port = htons( nPort );
    InetPtonW( AF_INET6, lpszHost, &addr.sin6_addr );
#ifdef MY_SOCKET_SERVER
// Server
    BOOL bSuccess = socket.Bind( reinterpret_cast<const sockaddr*>(&addr), sizeof(sockaddr_in6) );
#else 
// Client
    BOOL bSuccess = socket.Connect( reinterpret_cast<const sockaddr*>(&addr), sizeof(sockaddr_in6) );        
#endif
}

Другие вопросы по теме