socat是比nc更强大的网络瑞士军刀,其网络功能几乎无所不包,甚至提供了文件相关的命令filan与进程相关的procan,然而使用起来也比较复杂。
详见:http://www.dest-unreach.org/socat/
下面的程序实现了支持Range请求的http信息发送功能,配合socat,可以实现一个支持并发与寻址/续传的简单的流媒体服务器或文件服务器。
用法:
socat tcp-l:8080,reuseaddr,fork system:"./httpdv1.sh"
#!/bin/bash
# Licence: GPLv3 http://www.gnu.org/licenses/gpl-3.0.txt
# Author: kangkang <kangkang0517 at gmail.com> 2009
#
# Filename: httpdv1.sh
# A part of simple httpd with bash and socat.
#
#:> log
filename="$1"
len=$(cat "$filename"|wc -c)
send_header() {
echo -e "HTTP/1.1 200 OK"
#echo "Content-Type: text/plain"
echo "Content-Type: application/octet-stream"
echo "Accept-Range: bytes"
}
unset HEADER
declare -a HEADER
n=1
while read s; do
if [ -z "$(echo -n $s|tr -d "\r")" ]; then
header=$(for h in $(seq ${#HEADER[@]}); do echo ${HEADER[$h]}; done)
range=$(echo "$header"|grep Range|cut -f 2 -d "="|cut -f 1 -d "-")
if [ -z "$range" ]; then
send_header
echo "Content-Length: $len"
echo ""
cat "$filename"
else
bot=$((${len}-$range))
send_header
echo "Content-Range: ${range}-$len"
echo ""
tail -c $bot "$filename"
fi
break
fi
HEADER[$n]="${s}"
let n++
done
# $SOCAT_SOCKADDR
# $SOCAT_SOCKPORT
# $SOCAT_PEERADDR
# $SOCAT_PEERPORT