如题:
代码如下:
服务端:
class UdpService2
{
IPEndPoint m_ServerIP;
List<IPEndPoint> client_list;
bool m_bStart;
Thread m_tService;
Socket m_Service;
ShowImg m_ShowDlg;
List<UdpPacket> m_packs;
byte[] data = new byte[1024 * 1024];
public void SetPort(int port)
{
// 172.21.8.115
IPAddress ip = IPAddress.Parse("172.21.8.115");
this.m_ServerIP = new IPEndPoint(ip, port);
}
public void Start()
{
if (m_bStart)
return;
m_bStart = true;
client_list = new List<IPEndPoint>();
m_tService = new Thread(new ThreadStart(ServiceThread));
m_tService.Start();
m_ShowDlg = new ShowImg();
m_packs = new List<UdpPacket>();
//Thread t = new Thread(new ParameterizedThreadStart(B));
//t.Start("B");
}
public void Stop()
{
if (m_bStart)
{
m_bStart = false;
m_Service.Shutdown(SocketShutdown.Both);
m_Service.Close();
m_tService.Join();
}
}
private void ServiceThread()
{
// Console.WriteLine("UDP服务器开始监听" + serverIP.Port + "端口");
m_Service = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_Service.Bind(m_ServerIP);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)ipep;
// length = m_Service.ReceiveFrom(data, ref Remote);//接受来自服务器的数据
m_Service.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref Remote, new AsyncCallback(ServiceRecive), new AsyncState(data, 0, data.Length, Remote));
}
private void ServiceRecive(IAsyncResult result)
{
AsyncState state = (AsyncState)result.AsyncState;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)ipep;
try
{
m_Service.EndReceiveFrom(result, ref state.EndPoint);
client_list.Add(state.EndPoint as IPEndPoint);
result.AsyncWaitHandle.Close();
}catch(Exception ex){
int i = 1;
}
try
{
UdpPacket pack = UdpPacket.Deserialize(data);
if (IsRecive(pack))
{
//清空数据,重新开始异步接收
data = new byte[data.Length];
m_Service.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref Remote, new AsyncCallback(ServiceRecive), new AsyncState(data, 0, data.Length, Remote));
return;
}
m_packs.Add(pack);
if (m_packs.Count == pack.total)
{
MessageBox.Show("接收完成");
}
}
catch (Exception ex)
{
//MessageBox.Show(string.Format("Error: {0}, Length={1}", ex.Message, length));
}
//清空数据,重新开始异步接收
if (m_Service != null)
{
data = new byte[data.Length];
try
{
m_Service.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref Remote, new AsyncCallback(ServiceRecive), new AsyncState(data, 0, data.Length, Remote));
}
catch (System.Exception ex)
{
}
}
}
}
通过判断client_list 中有几个元素,来确定收到了几个包。
实际一共13个包,在程序中只收到2个包