1

C# に移植しようとしている C コードの一部があります。

私の C コードでは、ソケットを作成してから受信コマンドを発行します。受信コマンドは

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

現在、コマンド バッファーはcommand_buffer[8]、文字列へのポインターであることを含む新しい値で返されます。

.NET でこれを行う方法について、私は本当に混乱しています。.NET の Read() メソッドは、char ではなくバイトを具体的に受け取るためです。重要な部分は、文字列へのポインターを取得することです。

何か案は?

4

2 に答える 2

2

ソケット送受信 C#

Socket.Receive メソッド

Receive メソッドは、バインドされた Socket からバッファにデータを受信します。このメソッドは、受信したバイト数を返します。ソケット バッファが空の場合、WouldBlock エラーが発生します。後でデータの受信を試みる必要があります。

次のメソッドは、 size バイトをバッファにオフセット位置まで受信しようとします。操作が timeout ミリ秒を超えて続くと、例外がスローされます。

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) { /* ... */ }
于 2010-05-20T13:55:24.633 に答える
0

C# では、バイト配列と Unicode 文字列が区別されます。byte は符号なし 8 ビット整数で、char は Unicode 文字です。それらは交換可能ではありません。

同等のものrecvSocket.Receiveです。マネージ バイト配列の形式でメモリを割り当て、受信したバイトで配列を埋める Receive メソッドに渡します。関連するポインターはありません (オブジェクト参照のみ)。

Socket mysocket = // ...;

byte[] commandBuffer = new byte[8];
socket.Receive(commandBuffer);
于 2010-05-20T13:52:28.183 に答える