У меня есть часть кода C, который я пытаюсь портировать на C#.
В моем коде C я создаю сокет, и затем проблема a получает команду. Получить команда
void receive(mysocket, char * command_buffer)
{
recv(mysocket, command_buffer, COMMAND_BUFFER_SIZE, 0);
}
Теперь, буфер команд возвращается с новыми значениями включая command_buffer[8]
будучи указателем на строку.
Я действительно смущен относительно того, как сделать это в.NET, потому что.NET Read () метод конкретно берет в байтах и не символе. Важная часть - то, что я получаю указатель на строку.
Какие-либо идеи?
Метод 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) { /* ... */ }
C # делает различие между байтовыми массивами и строками Unicode. Байт - это 8-битное целое число без знака, а символ - это символ Юникода. Они не взаимозаменяемы.
Эквивалент recv
- Socket.Receive . Вы выделяете память в виде управляемого массива байтов и передаете ее методу Receive, который заполняет массив полученными байтами. Здесь нет указателей (только ссылки на объекты).
Socket mysocket = // ...;
byte[] commandBuffer = new byte[8];
socket.Receive(commandBuffer);