私はソケットプログラミングが初めてで、何か質問したいだけです。
クライアントとサーバーの間で単純な受信者と送信者のパケットを作成しようとしていましたが(同じコンピューターを使用しています)、問題が発生しました...
送信機能は正常に動作していますが、まったく同じサイズのパケットで送信されたパケットを受信する方法がわかりません。
たとえば、クライアントからサーバーに 5 バイトを送信します。サーバーに 5 バイトだけを受信させたいだけで、それ以上でもそれ以下でもなく、Socket でこれを実行したいのですが、短いパケットのサイズもすでに含まれています。 (int16 2 バイト) 形式。ここで私の送信パケットコード:
public static void Send(Socket socket, byte[] buffer, int timeout)
{
int startTickCount = Environment.TickCount;
int sent = 0;
int offset = 0;
int size = buffer.Length;
// Add size of packet in the begin of data packet with short (int16) format
List<byte> tmpdata = new List<byte>();
tmpdata.AddRange(BitConverter.GetBytes((short)(buffer.Length + 2)));
tmpdata.AddRange(buffer);
buffer = tmpdata.ToArray();
do
{
if (Environment.TickCount > startTickCount + timeout)
throw new Exception("Sending packet was timeout.");
try
{
sent += socket.Send(buffer, offset + sent, size - sent, SocketFlags.None);
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.WouldBlock ||
ex.SocketErrorCode == SocketError.IOPending ||
ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
{
Thread.Sleep(30);
}
else
throw ex;
}
} while (sent < size);
}
誰かが私を助けることができますか?
修正してくれたダミアンに感謝します。解決策が見つかりましたが、各バイトをループするため、メモリ使用量が消費されるのではないかと心配しています。コードは次のとおりです。
public static byte[] Receive(Socket socket)
{
System.Net.Sockets.NetworkStream ns = new NetworkStream(socket);
int b = (byte)1;
List<byte> databuf = new List<byte>();
while ((b = ns.ReadByte()) != -1)
databuf.Add((byte)b);
return databuf.ToArray();
}
NetworkStream を使用しない、またはパフォーマンスを向上させるより良いソリューションはありますか? ありがとう