kangkang's blog

标题: 使用socat的httpd
2009-08-31 15:30:22

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
发表于: Bash