清除C#中的缓冲区内容

时间:2014-04-23 08:05:52

标签: c# visual-studio buffer ar.drone

我正在开发一个程序,我不断发送控制命令来控制AR.Drone。我正在将内容写入缓冲区并发送到套接字。 当我执行程序时,无人机的行为不符合要求。我认为这可能是由于缓冲区中排队的内容未被发送。 所以我想在发送任何新命令之前清除缓冲区的内容。我怎样才能做到这一点? 在C中我们可以使用flush()。它在C#中是什么? 我的代码是:

    Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    IPAddress send_to = IPAddress.Parse("192.168.1.1");
    IPEndPoint sending_end_point = new IPEndPoint(send_to, 5556);
    string buff1;
    byte[] buff2;

每按一次按钮,我就会在文本文件中写一个字符串。然后我读取文本文件以检索内容并根据内容发送相应的命令。每次我覆盖前一个字符串时都在文本文件中,因此文本文件中只有一个字符串。

    switch (choice1)
                    {
                        case "takeoff":
                            {

                                System.Console.WriteLine("send take-off command");
                                buff1 = null;
                                buff2 = null;
                                buff1 = String.Format("AT*REF={0},290718208\r", seq);
                                buff2 = Encoding.ASCII.GetBytes(buff1);
                                sending_socket.SendTo(buff2, sending_end_point);
                                seq = seq + 1;
                                break;

1 个答案:

答案 0 :(得分:0)

  

所以我想在发送任何新命令之前清除缓冲区的内容。

在显示的代码中,您每次都在创建一个新的缓冲区。无需清除/重置/刷新。


你提到Socket;在这种情况下,这是Nagle的好机会。尝试设置:

socket.NoDelay = true;

请注意,如果您执行此操作,则需要执行之前发送所需的任何缓冲。避免这样的事情:

netStream.Write(oneByte);
netStream.Write(threeBytes);
netStream.Write(twoBytes);

因为这将导致数据包碎片。如果您有类似的现有代码,那么实用的修补方法是将NetworkStream包含在BufferedStream中,将Flush()包含在逻辑消息的末尾。