none
Windows8.1でWinsock2のWSAConnectが失敗する。 RRS feed

  • 質問

  • お世話になっております。

    VS2012のVC++でサーバと通信するWinsock2クライアントを作成しています。Windows7やWindows Server 2008R2では

    何の問題もなくサーバと接続できたコードが、Windows8.1(Windows8は未確認)ではConnectで失敗しGetLastErrorでエラーを取得すると10049

    "WSAEADDRNOTAVAIL"が返ります。

    以下がそのコードです。最後のWSAConnectで失敗します。同様の経験をお持ちの方がいらっしゃればアドバイスをいただければと存じます。

    WSADATA wsd;

    //Winsockの初期化は問題なく動作

    int ret = WSAStartup( MAKEWORD( MAJOR_VERSION, MINOR_VERSION ), &wsd );

    //Socketの作成も問題なく動作する

    socket = WSASocket(AF_INET,SOCK_STREAMIPPROTO_TCPNULL,0,0);

    //WSAConnectで失敗する。config->LmAddredssに接続先IPアドレスが格納されている。

    char ipaddr[16];

    WideCharToMultiByte(CP_ACP,0,config->LmAddress,-1,ipaddr,sizeof(ipaddr),NULL,NULL);

    SOCKADDR_IN SockAddr;

    ::ZeroMemory( &SockAddr, sizeof(SOCKADDR_IN) );

    SockAddr.sin_family = AF_INET;

    SockAddr.sin_addr.s_addr = inet_addr( ipaddr );

    SockAddr.sin_port = htons( config->LmPort );

    ret = WSAConnect( socket,(SOCKADDR*)&SockAddr,sizeof(SockAddr),NULL,NULL,NULL,NULL);

    2014年11月5日 23:15

回答

  • 今まで動作していたのであれば別の要因(configの値が正しくないなど)ではないでしょうか?

    蛇足ですが、エラーの取得はGetLastError()ではなくWSAGetLastError()です。またBSDソケット互換のinet_addr()はchar(ANSI文字コード)しか受け付けませんが、Windows Vista以降ではTCHARを受け付けるRtlIpv4StringToAddress()が用意されているためこちらを使えば文字コード変換は不要です。

    • 回答としてマーク 星 睦美 2014年12月2日 8:04
    2014年11月6日 0:53

すべての返信

  • 今まで動作していたのであれば別の要因(configの値が正しくないなど)ではないでしょうか?

    蛇足ですが、エラーの取得はGetLastError()ではなくWSAGetLastError()です。またBSDソケット互換のinet_addr()はchar(ANSI文字コード)しか受け付けませんが、Windows Vista以降ではTCHARを受け付けるRtlIpv4StringToAddress()が用意されているためこちらを使えば文字コード変換は不要です。

    • 回答としてマーク 星 睦美 2014年12月2日 8:04
    2014年11月6日 0:53
  • 返信ありがとうございます。

    もう少し範囲を広げて調査してみるようにします。

    2014年11月6日 13:26