我正在开发一个程序,在该程序中,我不断发送控制命令来控制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},290718208r", seq);
buff2 = Encoding.ASCII.GetBytes(buff1);
sending_socket.SendTo(buff2, sending_end_point);
seq = seq + 1;
break;
所以我想在发送任何新命令之前清除缓冲区的内容。
在显示的代码中,您每次都要创建一个新的缓冲区。无需清除/重置/清除此项。
你提到了一个Socket
;在这种情况下,很有可能这就是纳格尔。尝试设置:
socket.NoDelay = true;
请注意,如果您这样做,您的工作是在发送之前执行任何必要的缓冲。避免使用以下内容:
netStream.Write(oneByte);
netStream.Write(threeBytes);
netStream.Write(twoBytes);
因为这将导致分组碎片化。如果您有这样的现有代码,一个实用的解决方案是将NetworkStream
封装在BufferedStream
中,并将Flush()
封装在逻辑消息的末尾。