.NET, эквивалентная из recv?

У меня есть часть кода C, который я пытаюсь портировать на C#.

В моем коде C я создаю сокет, и затем проблема a получает команду. Получить команда

void receive(mysocket, char * command_buffer)
{
    recv(mysocket, command_buffer, COMMAND_BUFFER_SIZE, 0);
}

Теперь, буфер команд возвращается с новыми значениями включая command_buffer[8] будучи указателем на строку.

Я действительно смущен относительно того, как сделать это в.NET, потому что.NET Read () метод конкретно берет в байтах и не символе. Важная часть - то, что я получаю указатель на строку.

Какие-либо идеи?

1
задан dtb 20 May 2010 в 14:01
поделиться

2 ответа

Socket Send and Receive C#

Метод Socket.Receive

Метод Receive получает данные из связанного Socket в ваш буфер. Метод возвращает количество принятых байт. Если буфер сокета пуст, возникает произойдет ошибка WouldBlock. Вам следует попытаться получить данные позже.

Следующий метод пытается получить байты размера в буфер до позиции смещения. Если операция длится больше, чем таймаут миллисекунд, он выбрасывает исключение.

public static void Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
{
  int startTickCount = Environment.TickCount;
  int received = 0;  // how many bytes is already received
  do {
    if (Environment.TickCount > startTickCount + timeout)
      throw new Exception("Timeout.");
    try {
      received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
    }
    catch (SocketException ex)
    {
      if (ex.SocketErrorCode == SocketError.WouldBlock ||
          ex.SocketErrorCode == SocketError.IOPending ||
          ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
      {
        // socket buffer is probably empty, wait and try again
        Thread.Sleep(30);
      }
      else
        throw ex;  // any serious error occurr
    }
  } while (received < size);
}

Call the Receive method using code such this:
[C#]

Socket socket = tcpClient.Client;
byte[] buffer = new byte[12];  // length of the text "Hello world!"
try
{ // receive data with timeout 10s
  SocketEx.Receive(socket, buffer, 0, buffer.Length, 10000);
  string str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
}
catch (Exception ex) { /* ... */ }
2
ответ дан 3 September 2019 в 00:25
поделиться

C # делает различие между байтовыми массивами и строками Unicode. Байт - это 8-битное целое число без знака, а символ - это символ Юникода. Они не взаимозаменяемы.

Эквивалент recv - Socket.Receive . Вы выделяете память в виде управляемого массива байтов и передаете ее методу Receive, который заполняет массив полученными байтами. Здесь нет указателей (только ссылки на объекты).

Socket mysocket = // ...;

byte[] commandBuffer = new byte[8];
socket.Receive(commandBuffer);
0
ответ дан 3 September 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: