#c #borland-c
#c #borland-c #c #borland-c
Вопрос:
У меня есть требование отправки строкового значения на определенный IP-адрес, но строковое значение должно содержать два Ascii Null
значения.
Например: NULL message NULL
Мне удалось отправить сообщение с помощью sck->Socket->SendText(Edit1->Text);
, но я не знаю, как отправить нулевое значение через SocketClient
компонент. Это не обязательно должен быть метод отправки текста. Подойдет любой метод, позволяющий отправить пакет данных с двумя нулевыми символами, заключенными в символ with.
Я довольно новичок в C . Если кто-нибудь может мне помочь, я был бы очень признателен. Заранее благодарю.
void __fastcall TFrmCageCom::Reset(TObject Sender) {
TClientSocket socket = new TClientSocket(this);
socket = sockets[1]; // Getting a socket from
if (socket->Active) {
String data = GeneratePackect(isNumeric, "", size, false);
String packet = "@1@2@3@"; // "@" sign necessary to divide each character in
// receivers end
socket->Socket->SendText(packet);
}
}
Комментарии:
1. Можем ли мы посмотреть, что у вас есть на данный момент?
2. Вся программа слишком длинная, но я загружаю компоненты clientSocket динамически для каждого IP-адреса и отправляю нужную мне строку, используя метод SendText в Socket socket-> Socket-> SendText (packet);
3. Тем не менее, вам нужно предоставить по крайней мере достаточно подробностей, чтобы действительно знать, что
Edit1
такое и соответствующийText
член? И чтоsck
/Socket
есть, конечно? Я полагаю, какой-то VCL?AnsiString
/UnicodeString
?4. Можете ли вы создать программу меньшего размера (попробуйте ее создать) , которая просто создает сообщение и отправляет
NULL message NULL
его через сокет? И покажите нам это?5. @Vortex: я не уверен, каким будет этот
String
класс (опять же, это не стандартный C ), но попробовать стоитString packet = "@1@2@3";
— это может «просто» сработать….
Ответ №1:
Я не знаю, что это за тип Edit1->Text
, поэтому вам может потребоваться сделать что-то ниже, чтобы преобразовать a const char*
в буфер ASCIIZ или в a std::string
. Похоже SendBuf
, что поддерживается двоичная передача — см. http://bcbjournal.org/articles/vol4/0004/Using_sockets.htm ?PHPSESSID=ec48204948f2965316eec877d313d231
#include <string>
std::string s("");
s = Edit1->Text; // <--- not sure about this line!
s = '';
sck->Socket->SendBuf(s.data(), s.size());
Тем не менее, эта библиотека сокетов не является частью стандартного C , поэтому для такого рода вопросов необходимо найти некоторую документацию по библиотеке Borland.
Комментарии:
1. Спасибо, Тони Ди, я рассмотрю это
2. Ну,
Edit1
звучит как какой-то элемент управления VCL, который может использоватьwchar_t
string class (UnicodeString
) . Или нет, в зависимости от версии компилятора. Такs = Edit1->Text.c_str()
может сработать или нет… @Vortex на самом деле не предоставил здесь никаких подробностей…3.
?PHPSESSID=ec48204948f2965316eec877d313d231
Lol во время сеанса в параметре GET
Ответ №2:
Во-первых, TClientSocket
не является частью Borland C . Это часть библиотеки VCL, которая поставляется с C Builder и Delphi; оба из которых являются разными продуктами для Borland C . Было бы неплохо указать, какой продукт и какую версию вы используете (эта библиотека сокетов претерпевала изменения с годами — как и раньше String
).
TClientWinSocket::SendText
предназначен для отправки String
. Итак, ваши варианты:
- Вставьте нулевые байты в
String
. - Используйте другую функцию отправки.
Вы пробовали читать документацию (или использовать code insight)? Вы можете отправлять необработанные байты, используя SendBuf
:
socket->Socket->SendBuf( "", 1 );
socket->Socket->SendText( packet );
socket->Socket->SendBuf( "", 1 );
В качестве альтернативы, поскольку String
имеет operator
перегрузку и неявный конструктор from char
, поэтому вы можете написать:
socket->Socket->SendText( '' packet '');
Некоторые другие комментарии. Опубликованный вами код является незаконным:
TClientSocket socket = new TClientSocket(this);
Вы не можете автоматически выделять объекты VCL, это не должно скомпилироваться. Интересно, вы имели в виду, что это так TClientSocket *socket = new TClientSocket(this)
. (Если это так, пожалуйста, скопируйте и вставьте свой код вместо того, чтобы набирать материал из памяти, кто знает, какие еще тонкие различия существуют между тем, что вы опубликовали, и тем, каков ваш реальный код).
Если вы имели в виду то, что я предложил, то у вас ошибка, потому что:
socket = sockets[1];
socket
указывает на sockets[1]
, а не на сокет, который вы только new
что выбрали. (Использование оператора присваивания с указателями в C означает изменение направления указателя; в общем, если вы хотите выполнить присваивание объекта, вам нужно будет написать *ptr = *other_ptr;
. Однако объекты VCL в основном не копируются).
Далее, поведение Edit1->Text
зависит от того, используете ли вы Unicode или нет. Это может быть узкая строка или широкая строка. Вы должны включить эту информацию при публикации своего вопроса.