1

在一台服务器上,我在 192.168.0.51 上从 192.168.0.21 上运行的应用程序接收 udp 数据包,并且必须使用特定的确认数据包进行回复。

我写的解决方案如下:

#!/bin/bash
send_ack() {
<calculate $ack - code removed>
echo -n "$ack" | nc -u -w1 192.168.0.21 8076
}
while [ 1 ]
do
    for string in $(/usr/sbin/tcpdump -Avnni eth0 -c 1 dst 192.168.0.51 and udp port 8076)
    do
        send_ack &
    done
done

问题是当数据包到达太快时我似乎有一些运行状况,我猜它们在 tcpdump 重新启动之前到达。我尝试了 -l 用于单行缓冲区而不是 -c 1 没有成功。

有人对如何解决这个问题有任何想法吗?

谢谢,期待:)

4

1 回答 1

1

您的程序中的问题是数据包会在 tcpdump 调用之间溜走,因为您只是运行它来捕获单个数据包-c 1,然后每次都再次退出。

解决方案是在行缓冲模式 () 下连续运行 tcpdump,-l并将其输出通过管道传输到读取该模式的进程。

#!/bin/bash
# tcpdump line buffered and piped to infinite loop
/usr/sbin/tcpdump -Avnni eth0 -l dst 192.168.0.51 and udp port 8076 | \
  while true; do
    # read output line by line
    read result
    # only act on non-blank output
    if [ "$result" != "" ]; then
      echo "Read a packet: $result"
      # perform whatever action
      send_ack &
    fi
  done

除此之外,您可能还想尝试设置缓冲区大小的选项,-B以及.tcpdumpread

于 2013-06-18T09:21:13.997 回答