5

バイト配列としてデバイスにリクエストを送信していますが、デバイスからの応答を受信したいと考えています。

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

ここで、プログラムはエラーを出します。エラー1
「System.Net.Sockets.Socket.Receive(byte [])」に最もよく一致するオーバーロードされたメソッドに無効な引数がいくつかありますエラー2
引数「1」:「System.Collections.Generic」から変換できません.List'から'byte[] '

どうすれば解決できますか?

ありがとう。

4

6 に答える 6

6

エラーがバイト[]を使用するように指示するように

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

こちらもご覧ください

于 2009-09-02T08:33:30.280 に答える
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] );
}

もちろん、おそらくバイトをデバッグ出力に書き込む以上のことをしたいでしょうが、アイデアは得られます:)

クライアントがメッセージを複数のパケットに分割した場合、1 つが通過 (および受信) され、その後別のパケットが受信される可能性があるため、不完全なデータを取得する可能性があることに注意する必要があります。期待するデータ量をサーバーに伝える何らかの方法を用意しておくと、サーバーはメッセージを処理する前に完全なメッセージを組み立てることができます。

于 2009-09-02T08:43:26.000 に答える
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 つの配列を作成するため、より多くのメモリを使用することに注意してください。

于 2010-11-09T13:47:40.093 に答える
0

Receive を呼び出す前にリストとして機能する必要がある場合は、次も使用できます。

  deviceSocket.Receive(coming.ToArray());
于 2009-09-02T08:44:09.650 に答える
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 テキスト ボックスで何も取得できません。たぶん、構文エラーがあるか、Receive 関数が List<> 互換で機能しないと思われます。

返事が遅くなってすみません、私はそれらを手に入れようとしました:)

于 2009-09-02T11:02:06.813 に答える