我是套接字编程的新手,我只是想问一些问题。
我试图在客户端和服务器之间创建简单的接收方和发送方数据包(我使用的是同一台计算机),但我遇到了问题......
发送功能正常,但我不知道如何接收以完全相同大小的数据包发送的数据包。
例如,我从客户端向服务器发送 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);
}
有人能帮我吗?
感谢 Damien 的修复我找到了解决方案,但我担心这会消耗内存,因为它循环每个字节,这里的代码:
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 或者更好的性能有没有更好的解决方案?谢谢