2010-05-20 90 views
1

我有一部分C代碼,我試圖移植到C#。.NET相當於recv?

在我的C代碼中,我創建一個套接字,然後發出一個接收命令。接收命令是

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 2010-05-20 14:04:04

回答

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方法

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 2010-07-05 16:06:07