4

次のC++コードを使用して、IPv4文字列アドレスからsockaddr_in構造体にデータを入力しようとしています。

// WSAStringToAddress
struct sockaddr_in sock;

int addrSize = sizeof( struct sockaddr_in );

memset( &sock, 0, addrSize );

sock.sin_family = AF_INET;

rc = WSAStringToAddress( (LPWSTR) "192.168.0.1", 
                         AF_INET, 
                         NULL, 
                        (LPSOCKADDR) &sock, 
                        &addrSize ); 

if ( rc != 0 )
{
    rc = WSAGetLastError();

    printf( "WSAStringToAddress: error=[%d]\n", rc );
}

WSAEINVALであるエラーコード10022で失敗しています。http://msdn.microsoft.com/en-us/library/windows/desktop/ms742214%28v=vs.85%29.aspxには、 sockaddr_inのアドレスファミリがAF_INETに設定されていない場合、または私が明確に行ったAF_INET6。

Visual C ++ 2008ExpressEditionをWindowsServer2008 R2 SP1で実行していますが、Windows XP / Windows Server 2000以降の下位互換性が必要なため、新しいアドレス変換機能を使用していません。

誰かがこの問題を解決する方法を知っていますか/私のコードの何が問題になっていますか?あなたが与えることができるどんな解決策もありがたいです:D

編集:WSAStringToAddressAを使用すると、tcharの代わりにASCII文字を使用できることがわかりました

4

3 に答える 3

6

WSAStringToAddress()WSAEINVAL要求されたアドレスを変換できない場合に失敗します。不一致の家族の価値は、WSAEINVALエラーが発生する唯一の方法ではありません。char[]@ChristianStieberが述べたように、16ビットwchar_t*ポインタが期待される場所で8ビット文字列リテラルを渡すために型キャストを使用しています。それはまったく間違っています。にゴミを渡しているのですがWSAStringToAddress()、それを検出しています。

TEXT()文字列リテラルを値に渡すときは、代わりにマクロを使用する必要がありLPTSTRます。例:

rc = WSAStringToAddress( TEXT("192.168.0.1"), ... );

WSAStringToAddress()それ以外の場合は、Unicodeバージョンを直接呼び出し、L文字列リテラルの前にプレフィックスを付けて、のwchar_t[]代わりに使用しますchar[]。例:

rc = WSAStringToAddressW( L"192.168.0.1", ... );
于 2012-07-27T19:44:24.460 に答える
0

私がオンラインで見た例では、addrSizeをsizeof(struct sockaddr_storage)に設定しています。

このリンクに例があります。

于 2012-07-27T19:34:03.473 に答える
0

私の意見では、このコメントは、それがこのエラーの唯一の考えられる理由であるとは言っていません。

特に、この行は私を襲います:

(LPWSTR) "192.168.0.1",

あなたは8ビットの文字列を取り、それをワイドバージョンにキャストしています。L "192 ...."を使ってみましたか?

于 2012-07-27T19:34:46.210 に答える