C# socket接收不定长数据
时间: 2023-07-27 15:06:13 浏览: 46
在C#中,可以使用以下方式接收不定长数据:
1. 首先,定义一个缓冲区用于存放接收到的数据。
2. 然后,进入一个循环,每次接收一定长度的数据,将其存入缓冲区。
3. 判断接收到的数据是否满足结束标志,如果满足,则跳出循环。
4. 如果不满足,则继续接收数据,直到接收到结束标志为止。
以下是一个简单的示例代码:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class Server
{
// 定义结束标志
private static readonly byte[] END_FLAG = Encoding.ASCII.GetBytes("end");
public static void Main()
{
// 创建Socket对象
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定IP和端口号
listener.Bind(new IPEndPoint(IPAddress.Any, 8000));
// 开始监听连接
listener.Listen(1);
while (true)
{
// 接受连接
Socket handler = listener.Accept();
Console.WriteLine($"Connected by {handler.RemoteEndPoint}");
// 定义缓冲区
byte[] buffer = new byte[1024];
byte[] data = new byte[0];
while (true)
{
// 每次接收1024个字节的数据
int bytesReceived = handler.Receive(buffer);
// 将接收到的数据存入缓冲区
data = data.Concat(buffer.Take(bytesReceived)).ToArray();
// 判断是否接收到结束标志
if (data.Length >= END_FLAG.Length && data.Skip(data.Length - END_FLAG.Length).SequenceEqual(END_FLAG))
{
break;
}
}
// 处理接收到的数据
string message = Encoding.ASCII.GetString(data);
Console.WriteLine($"Received: {message}");
// 关闭连接
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
}
```
在上面的代码中,我们定义了一个结束标志为`END_FLAG`。在每次接收数据时,我们将接收到的数据存入缓冲区`data`中。如果接收到的数据中包含结束标志,则跳出循环,否则继续接收数据。最后,我们处理接收到的数据并关闭连接。