2011-11-07 36 views
2

Unicode文字列をクライアントに送信するために、以下のコードを変更しました。C++でwinsock経由でUnicode文字列を送信

私はtxtにUnicode文字が含まれていると、クライアントで私は何のデータも受け取れないのですか?

bool write_to_descriptor(int desc, wchar_t *txt, int length) 
//bool write_to_descriptor(int desc, char *txt, int length) 
{ 
    int iStart; 
    int nWrite; 
    int nBlock; 

    if (length <= 0) 
    length = strlen(txt); 

    for (iStart = 0; iStart < length; iStart += nWrite) 
    { 
    nBlock = UMIN(length - iStart, 4096); 
    if ((nWrite = send(desc, txt + iStart, nBlock, 0)) < 0) 
     { perror("Write_to_descriptor"); return FALSE; } 
    } 

    return TRUE; 
} 
+1

'length = strlen(txt);'は 'wchar_t'を正しく表示しません。コンパイラはあなたに警告していませんか?そして 'txt + iStart'はおそらくあなたがここで好きなことをしないでしょう。 – user786653

+2

受信コードも参照する必要があります。 – Neil

+0

最も確実です。 – JosephH

答えて

2

は、TCP(およびUDP)プロトコルについてwchar_tようなものはありません。関数sendの場合はwchar_tというようなものはありません。生のバイナリデータ(バイトのシーケンス)のみが存在します。 - ゼロで終了するワイド文字列の長さがwcslenで算出機能

  1. length = strlen(txt);

    このコードの問題は、以下です。最初のワイド文字がASCII(またはLatin1)文字の場合、strlenは1を返します(2番目のバイトは最初のワイド文字の上位バイトであり、ASCIIの場合は0を含むため、WIN32プラットフォーム上のワイド文字列のリトルエンディアンUTF16文字列の場合)。 char)

  2. nWrite = send(desc, txt + iStart, nBlock, 0)あなたsendBYTESない文字(特にないワイド文字)。したがって、ワイド文字列のバイナリ表現(ポータブルではないため、ネットワーク経由では送信しないでくださいが、クライアントとサーバが同じプラットフォーム上にある場合は動作します)を送信する場合は、nWrite = send(desc, txt + iStart, sizeof(wchar_t)*nBlock, 0)のようにする必要があります。あなたがあなたのようにそれを送るとき、あなたは広い文字列の半分だけを送ります。もちろん、接続の反対側のアプリケーションでは、特定のプラットフォーム用のワイド文字列のバイナリ表現が送信されます(ASCII文字列などではありません)。

  3. もちろん、プラットフォーム/コンパイラ固有の内部バイナリワイド文字列表現を送信するようなことは絶対にしないでください。テキスト表現には、ASCIIまたはUTF-8文字エンコーディングの大部分を使用する(telnetやHTTPなどのような)十分に文書化されたネットワークプロトコルを使用する必要があります。したがって、ワイド文字列を、選択したプロトコルに必要な表現に変換する必要があります。

関連する問題