2009-09-02 38 views
3

我向設備發送請求作爲字節數組,並且我想要接收anwser設備給出的請求。C#中的動態字節數組通過套接字編程[列表<byte>不起作用]

... 
Socket deviceSocket = new Socket(server); 
List<byte> coming = new List<byte>(); 
... 
deviceSocket.Receive(coming) 

這裏程序給出錯誤: 錯誤1
關於 'System.Net.Sockets.Socket.Receive(字節[])' 最好的重載的方法匹配具有一些無效參數 錯誤2
參數'1':無法從'System.Collections.Generic.List'轉換爲'byte []'

我該如何解決?

謝謝。

回答

1

如果您需要來充當列表調用接收你也可以使用之前:

deviceSocket.Receive(coming.ToArray()); 
+4

你確定它的工作原理?它編譯,但你有數據嗎? – 2009-09-02 08:58:23

+0

好點,我可能會急着回答,並沒有看到爲什麼Recieve方法首先使用數組。 此解決方案將創建一個與列表中的內容相同的新數組,但您稍後將無法訪問該數組。最好的解決方案是創建一個臨時數組或最初使用一個數組,如PoweRoy的答案。 – 2009-09-02 09:06:03

+0

它確實工作很抱歉,coming.ToArray()必須分配給antoher數組 – Cmptrb 2009-09-03 12:28:55

6

作爲錯誤通知使用字節[]

Socket deviceSocket = new Socket(server); 
byte[] coming = new byte[buffersize]; 
... 
deviceSocket.Receive(coming) 

參見this

+0

感謝您的回答,頁面將幫助我 – Cmptrb 2009-09-02 08:47:08

+0

這不是一個動態數組 – 2012-03-23 13:58:55

1

的Socket.Receive()方法將填充緩衝器與儘可能多的數據,因爲它可以適合,或作爲大量數據可用,以較低者爲準。

如果你知道你所有的消息在2048個字節,那麼你可以聲明如下的緩衝:

byte[] buffer = new byte[2048]; 
int bytesReceived = 0; 
// ... somewhere later, getting data from client ... 
bytesReceived = deviceSocket.Receive(buffer); 
Debug.WriteLine(String.Format("{0} bytes received", bytesReceived)); 
// now process the 'bytesReceived' bytes in the buffer 
for(int i = 0; i < bytesReceived; i++) 
{ 
    Debug.WriteLine(buffer[i]); 
} 

當然,你可能想要做的東西多寫字節到調試輸出,但你得到的想法:)

你仍然需要知道,你可能會得到不完整的數據,如果客戶端破壞成多個數據包的消息,然後可能會通過(並被接收),然後再來。通過某種方式告訴服務器需要多少數據總是好事,然後在處理它之前可以組裝完整的消息。

+0

客戶端[我的項目中的設備]發送不同長度的不同請求答案。我用CRC字節接收數據,所以我可以理解,如果答案已損壞。 謝謝你的回答,我明白了:) – Cmptrb 2009-09-02 08:51:06

+0

你的信息是否包含一個已知的「終結者」?例如\ 0x00,如果是這樣,那麼你可以繼續接收你的緩衝區,並將緩衝區的內容處理成列表,直到你得到這個終結符,緩衝區中剩下的任何東西都是另一個消息的一部分。 – 2009-09-03 01:06:10

+0

不,我的接收消息不包含任何終止符,它們有不同的長度,我需要一個真正的動態字節數組來處理我的工作。最後最糟糕的情況是設置一個長度很長的靜態數組。這對我有害,因爲我應該爲未來的消息編寫分析算法。我只知道我的請求的答案的長度... – Cmptrb 2009-09-03 11:57:14

0
byte[] coming = new byte[8]; 
deviceSocket.Receive(coming); 
for (int i = 0; i < 8; i++) 
{ 
    xtxtComing.Text += coming[i].ToString() + " "; 
} 

上面我的聽力環路工程的代碼[xtxtComing是一個文本框!

名單來了沒有提供任何錯誤遵守。

    List<byte> coming1 = new List<byte>(); 
        deviceSocket.Receive(coming1.ToArray()); 
        for (int i = 0; i < coming1.ToArray().Length; i++) 
        { 
         xtxtComing.Text += "a " + coming1[i].ToString() + " "; 
        } 

在同一迴路不起作用上面這些代碼,我不能得到xtxtComing 文本框任何東西。也許我有一個語法錯誤,或者我相信接收功能不起作用 列表<>兼容。

對不起,遲到的回答,我試圖讓他們:)

1

我會解決這個問題是這樣的:

int bytesRead = 0; 
byte[] incomming = new byte[1024]; 
byte[] trimmed; 

try 
{ 
    bytesRead = sTcp.Read(incomming , 0, 1024); 
    trimmed = new byte[bytesRead]; 

    Array.Copy(incomming , trimmed , bytesRead); 
} 
catch 
{ 
    return; 
} 

但小提醒的是,你實際上創建2個陣列,從而使用更多記憶!