2010-05-20 4 views
1

У меня есть часть кода C, которую я пытаюсь передать на C#..NET-эквивалент recv?

В моем коде на C я создаю сокет, а затем выдаю команду receive. Команда получает

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

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

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

Любые идеи?

+1

recv не дает вам _string_, это дает вам указатель на некоторые символы. Эти символы могут иметь какой-либо смысл. – Joren

ответ

0

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

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

Socket mysocket = // ...; 

byte[] commandBuffer = new byte[8]; 
socket.Receive(commandBuffer); 
2

Socket Send and Receive C#

Socket.Receive метод

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

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

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) { /* ... */ } 
+0

+1 для использования кодировки для перевода с байта [] в строку, которая (я считаю) на самом деле является ответом на вопрос. Все остальное дополнительно. 8) – Task

Смежные вопросы