【问题标题】:Socket Programming with MFC使用 MFC 进行套接字编程
【发布时间】:2018-07-24 16:29:22
【问题描述】:

MFC 是否支持Ipv6 套接字编程? 以便我们可以使用 Microsoft 基础类连接到具有Ipv6 地址的服务器? I have read this link 但对我帮助不大。

【问题讨论】:

  • 谢谢,实际上我有一个 MFC 应用程序可以在 ipv4 上正常工作,但我想在同一个应用程序中使用 Ipv6 这可以吗???

标签: c++ sockets mfc ipv6


【解决方案1】:

CAsyncSocket 确实支持 IPv6。有几种方法可以做到这一点:

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

不过,我建议直接使用 Winsock 2 API。

【讨论】:

  • 谢谢我没有得到 ConnectEx 方法你能分享我的链接吗
  • @AndrewKomiagin 在documentation 中没有提到ConnectEx()BindEx(),但有Connect()Bind() 重载将SOCKADDR* 作为输入。是这个意思吗?
  • @AndrewKomiagin 我已使用 ConnectEx() 连接 ipv6 方法我收到此错误代码 10047“协议系列不支持地址系列”请确认此功能是否适用于 ipv6
  • 请提供最小示例。你初始化winsock了吗?
  • 我已经初始化了 winsock,但仍然出现此错误 10047:-“使用了与请求的协议不兼容的地址。所有套接字都使用关联的地址族(即 Internet 协议的 AF_INET)和通用协议类型(即 SOCK_STREAM)”这意味着不能使用 AF_INET6
【解决方案2】:

这里的代码对我有用:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多