C# 由于读取延迟,TcpListener套接字数据丢失

C# 由于读取延迟,TcpListener套接字数据丢失,c#,.net,windows,sockets,C#,.net,Windows,Sockets,我正在做一个GPS车辆跟踪项目。这里的设备用于向端口5000上的特定IP(静态IP)发送纬度和经度信号。总共有17台设备 我的问题是,当所有17个设备都被激活时,我没有在适当的时间内从所有设备获取读数。这意味着,如果我得到了设备1的读数,我将继续从该设备获得5到6个读数,之后当设备2我将继续获得5到6个读数时,它将继续进行 这里我要说的是,所有的设备每1分钟将读数(纬度和经度)传输到我的IP,但是当我从设备获得信号时,我只会在5到6分钟后从设备1获得设备2,然后是设备3 我的问题是我的应用程序正

我正在做一个GPS车辆跟踪项目。这里的设备用于向端口5000上的特定IP(静态IP)发送纬度和经度信号。总共有17台设备

我的问题是,当所有17个设备都被激活时,我没有在适当的时间内从所有设备获取读数。这意味着,如果我得到了设备1的读数,我将继续从该设备获得5到6个读数,之后当设备2我将继续获得5到6个读数时,它将继续进行

这里我要说的是,所有的设备每1分钟将读数(纬度和经度)传输到我的IP,但是当我从设备获得信号时,我只会在5到6分钟后从设备1获得设备2,然后是设备3

我的问题是我的应用程序正在丢失数据包。这意味着,当我的应用程序从设备17接收数据时,应用程序正在接收最后5到6分钟的读数,但它在过去10到30分钟内丢失了读数

如何使用一个套接字将所有设备的信号并行地传输到同一端口

这是我实现的代码:

Thread th_main, th_sub;
bool bool_Start_subTH;
Socket Socket_Client;
TcpListener objListener;


private void Form1_Load(object sender, EventArgs e)
{
    bool_Start_subTH=false;
    th_main = new Thread(GetDataFromClient);
    th_main.Start();
 }

void GetDataFromClient()
{
    objListener = new TcpListener(5000);
    objListener.Start();
    while (th_main.IsAlive)
    {
        Socket_Client= objListener.AcceptSocket();
        if(!bool_Start_subTH)
        { 
            th_sub=new Thread (SubFunctionThread);
            th_sub.start();
            bool_Start_subTH=false;
        }
    }
 }

void SubFunctionThread()
{
    while(th_sub.IsAlive)
    {
        if(Socket_Client.Avilable>0)
        {
            byte[] something = new byte[Socket_Client.Available];
            Socket_Client.Receive(something);
            string strmessage = Encoding.ASCII.GetString(something);
            Listbox1.Items.Add( strmessage);        
        }
    }
}

我认为问题在于处理客户机的线程,它停留在一个循环中,占用了所有的CPU。您应该避免使用可用的套接字,直接读取套接字(事实上,这就是您所要做的,等待某些数据进入),使其停止,直到一些数据进入。而且,你可能会改变

 if (Socket_Client.Avilable > 0)


如果您需要偶尔检查一次,例如线程不活动。

为每个连接的客户端启动一个接收器线程。不要将每条消息都添加到接收方线程的UI中,因为这可能是代码无法遵循的问题。您可以更改通信协议吗?我认为在有17个设备的情况下,tcp(需要为每个设备建立连接)可能不是很方便。我已经开发了这个项目与UDP没有问题。此外,我同意沃特太。
if (Socket_Client.Poll(1000000, SelectMode.SelectRead))