refs:
https://stackoverflow.com/questions/4739196/simple-socket-server-in-bash
http://hacktux.com/bash-socket/
http://www.cnblogs.com/hokyhu/archive/2011/09/27/2193489.html
做服务器:
$ nc -k -l portNum
$ nc -k -l 8999
$ nc -k -l 8999 > filename.out
做客户端
建立了一个到10.6.221.149:9865的可读可写的socket连接。
exec 3<>/dev/tcp/10.6.221.149/9865
发送请求其实很简单,就跟往文件里写数据一样。例如
1
|
exec
"hello world."
>&3
|
如果要发HTTP请求,那可以这样:
1
|
echo -e
"GET /crossdomain.xml HTTP/1.1\r\nHost:www.xx.com\r\n\r\n"
>&3
|
二进制请求可以这样发:
读取服务器响应跟读文件差不多,可以这样写:
1
|
cat bin_data >&3
|
其中bin_data是已经写好的二进制包数据文件。
读取服务器响应跟读文件差不多,可以这样写:
1
|
cat <&3
|
后台关闭连接以后,cat命令会自动结束。
如果是读取的二进制内容,可以用hexdump来查看。
如果是读取的二进制内容,可以用hexdump来查看。
1
|
hexdump -C -n 31 <&3
|
读出来效果如下:
其中-n是指示hexdump读31个字节就结束。
一个好的编程习惯,建立了连接要记得关闭。
要关闭上面的socket连接可以这么写:
当然,你不关闭其实也不一定有啥大问题,bash脚本执行结束,该连接会自动被关闭。
要关闭上面的socket连接可以这么写:
1
2
|
exec 3>&- # 关闭写,不能再发请求
exec 3<&- # 关闭读,不能再有返回
|
下面是我测试用的一个客户端:
1
2
3
4
|
#!/bin/sh
exec 3<>/dev/tcp/10.6.221.149/9865
echo
"<policy-file-request>"
>&3
cat <&3
|
瞧,这样的tcp客户端比C语言捣鼓出来的客户端代码少得不是一星半点啊。
用bash操作udp也差不多的,如法炮制试试吧。
当然,如果你很能捣鼓,还可以用bash写个服务端试试,捣鼓出来记得把代码分享给我看看。