1

C++ ライブラリを WinRT に移植中です。Winsock を使用しています。Winsock は WinRT ではサポートされていません。Microsoft は、代わりに Windows.Networking.Sockets を使用するように指示しています。Winsock API を Windows.Networking.Sockets API にマップしようとして、質問に直面しています。私はマネージド コードでソケットを使用しましたが、C++ では使用しませんでした。私は Winsock API に慣れていません。

他の質問にも出くわすことになると思いますが、まず最初に、ソケット エラー コードを取得する正しい方法を決定する必要があります。これは正しいマッピングだと思います: WSAGetLastError() == SocketError.GetStatus(hresult)

正しい?

  • このドキュメントでは、winsock を使用して発生する可能性のあるエラー コードについて詳しく説明しています:
    Windows Sockets Error Codes
  • このドキュメントは、私が同等だと思う列挙を詳しく説明していますが、非常に異なっています:
    SocketErrorStatus 列挙

エラー コードの数は、これら 2 つの間で大きく異なります。また、WSAGetLastError() は、失敗した最後の Windows ソケット操作のエラー ステータスを返します。ここで、SocketError.GetStatus(hresult) は、おそらく特定の試行された操作の例外処理から、入力として hresult を必要とします。この変更を行うにはかなりのリファクタリングが必要になるため、作業を行う前に、それが正しいことを確認したいと思います。

最後に、私が探しているマッピングを定義している誰かが参照できるドキュメントはありますか?

4

2 に答える 2

0

ブロックする WinRT C++/CX ソケット呼び出しはすべて非同期であるため、すぐに結果コードを返すことはありません。問題が発生すると、非同期タスクは例外をスローし、例外は待機しているタスクにマーシャリングされます。Microsoft のタスク ライブラリ (ppltasks.h)を使用していると仮定すると、ソケットをリモート インターフェイスに接続するコードは次のようになります。

StreamSocket^ socket = ref new StreamSocket();
// Assume portStr and hostName are defined elsewhere
String ^portStr;
HostName^ hostName;

task<void>(_connectSocket->ConnectAsync(hostName, portStr)).then([this] (task<void> previousTask)
{
    try
    {
        previousTask.get();
    }
    catch (Exception^ exception)
    {
        // If ConnectAsync gets an error, this is where you can catch it
        SocketErrorStatus status = SocketError.GetStatus(exception->HResult);
        // Do something interesting with HResult
    }
});

Microsoft の StreamSocket の例には、標準のソケット呼び出しを作成する例があり、エラー処理を含む、インターフェイスが呼び出されることを期待する方法の例がありますが、HResult を見る代わりに、常にエラー メッセージの文字列バージョンを出力します。例外。

于 2013-07-16T02:59:01.817 に答える