0

我正在从事 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);        
        }
    }
}
4

1 回答 1

0

我认为问题出在与客户端打交道的线程中,它停留在一个循环中,吃掉了所有的 CPU。您应该避免使用 Available 并直接读取套接字(实际上这就是您应该做的所有事情,等到有东西进来),让它停止,直到一些数据进入。另外,您可以更改

 if (Socket_Client.Avilable > 0)

经过

if (Socket_Client.Poll(1000000, SelectMode.SelectRead))

如果您需要不时检查一些东西,例如线程不活跃。

于 2013-06-25T11:54:19.067 回答