0
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int size =  MemoEnter->GetTextLen() + 1;
    wchar_t *szBuff = new wchar_t[size];
    memset(szBuff, 0, sizeof(szBuff));
    MemoEnter->GetTextBuf((wchar_t *)szBuff, size);
    TcpClient->SendBuf(szBuff, sizeof(szBuff));
    LogOut->Lines->Add(szBuff);
    delete []szBuff;
}  

TcpClient が何も送信しないのはなぜですか? サーバーは大丈夫です。接続は問題ありません。Telnet はデータをサーバーに送信しますが、このコードは送信しません。

彼ら!私がしようとしました

TcpClient->SendBuf("fsd", 3);

それでも何も得られなかった

4

2 に答える 2

2

これが問題の原因となっている可能性があります:

sizeof(szBuff); // Returns the sizeof a wchar_t*,
                // not the number of characters in szBuff

変化する:

memset(szBuff, 0, sizeof(szBuff));
...
TcpClient->SendBuf(szBuff, sizeof(szBuff));

に:

memset(szBuff, 0, sizeof(wchar_t) * size);
...
TcpClient->SendBuf(szBuff, wcslen(szBuff));

の 2 番目の引数がTcpClient->SendBuf()文字数ではなくバイト数である場合は、次のように変更します。

TcpClient->SendBuf(szBuff, wcslen(szBuff) * sizeof(wchar_t));
于 2012-01-31T13:26:38.527 に答える
0

の使用sizeof()は間違いなく問題です。バッファ自体のサイズではなく、バッファを指すポインタのサイズを指定してデータを送信しています。ポインターのサイズは、32 ビットでは 4、64 ビットでは 8 です。ポインタ サイズではなく、実際のバッファ サイズを使用する必要があります。

演算子を使用する代わりに、代わりにnew[]VCL のStringクラスを使用する必要があります。

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    String s = MemoEnter->Text; 
    TcpClient->SendBuf(s.c_str(), ByteLength(s)); 
    LogOut->Lines->Add(s); 
}

Stringのエイリアスであることに注意してくださいUnicodeString。受信者がエンコードされたデータを予期していない場合はUTF-16、データを送信する前に別のエンコードに変換する必要があります。たとえば、次のようになります。

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    String s = MemoEnter->Text; 
    UTF8String utf8 = s;
    TcpClient->SendBuf(utf8.c_str(), utf8.Length()); 
    LogOut->Lines->Add(s); 
}

または:

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    String s = MemoEnter->Text; 
    AnsiString ansi = s; // <-- potential data loss for non-ASCII characters!
    TcpClient->SendBuf(ansi.c_str(), ansi.Length()); 
    LogOut->Lines->Add(s); 
}

または:

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    String s = MemoEnter->Text; 
    AnsiStringT<SomeCodePage> ansi = s; // <-- use a suitable codepage to avoid data loss!
    TcpClient->SendBuf(ansi.c_str(), ansi.Length()); 
    LogOut->Lines->Add(s); 
}
于 2012-01-31T22:43:59.173 に答える