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

时间:2013-06-25 04:13:50

标签: c# .net windows sockets

我正在开展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);        
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为问题出在处理客户端的线程中,它处于循环中占用所有CPU。您应该避免使用Available并直接读取套接字(实际上这是你想要做的所有事情,等到有什么东西进入),让它停止直到某些数据进入。此外,你可能会改变

 if (Socket_Client.Avilable > 0)

通过

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

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