2013-05-16 2 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 대신 -l 대신 단일 행 버퍼를 사용하여 시도했지만 성공하지 못했습니다.

누구든지이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

덕분에 프로그램에서 :) 앞으로

답변

1

문제를 찾고 그냥 다시 때마다 종료 후 -c 1을 사용하여 하나의 패킷을 캡처를 실행하고 있기 때문에 패킷, tcpdump를 호출 사이에 의해 미끄러 것입니다 .

해결책은 라인 버퍼 모드 (-l)에서 tcpdump를 연속적으로 실행하여 그 출력을 파이프 라인 읽기 프로세스로 파이프하는 것입니다. 당신은 또한 당신이 버퍼 크기를 설정하고, read 다른 옵션으로 할 수 있습니다 tcpdump-B 옵션을 실험 할 수도 있습니다뿐만 아니라

#!/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 

.

관련 문제