C ++ Builder TtcpClient - PullRequest
       36

C ++ Builder TtcpClient

0 голосов
/ 31 января 2012
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);

и до сих пор ничего не получил

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Это может способствовать возникновению проблемы:

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));

Если вторым аргументом TcpClient->SendBuf() является количество байтов, а не символов, то измените на:

TcpClient->SendBuf(szBuff, wcslen(szBuff) * sizeof(wchar_t));
0 голосов
/ 01 февраля 2012

Использование sizeof() определенно является проблемой.Вы отправляете свои данные, указывая размер указателя, который указывает на буфер, а не размер самого буфера.Размер указателя составляет 4 в 32-разрядном и 8 в 64-разрядном.Вам нужно использовать фактический размер буфера вместо размера указателя.

Вместо того, чтобы использовать оператор new[], вместо этого следует использовать класс String VCL, например:

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); 
}
...