Как отправить НУЛЬ через сокет в Borland C

#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 . Итак, ваши варианты:

  1. Вставьте нулевые байты в String .
  2. Используйте другую функцию отправки.

Вы пробовали читать документацию (или использовать 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 или нет. Это может быть узкая строка или широкая строка. Вы должны включить эту информацию при публикации своего вопроса.