2013-05-16 117 views
1

在一臺服務器上,我從192.168.0.21上運行的應用程序接收192.168.0.51上的udp數據包,並且必須回覆一個特定的確認數據包。bash接收udp數據包tcpdump

的解決方案,我所寫的作品如下:

#!/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而沒有成功。

有沒有人有任何想法如何解決這個問題?

感謝,期待:)

回答

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選項tcpdump它可以讓你設置緩衝區的大小,並與read不同的選項進行試驗。