--------------------------------------
在用于重定向时,Bash有几个特定的文件名有特定的用途,(事实上这个文件名在文件系统中可能并不存在),例如:
/dev/tcp/$host/$port
host:
可以取值为有效的主机域名或IP地址
port:
可以取值为有效的端口号或服务名(在/etc/services中定义)
bash会尝试建立一个与远程TCP套接字相连接的TCP套接字。
例1:
echo
$?
成功则返回0
可以用于检测远程套接字是否存在。
例2:
exec
8<>/dev/tcp/192.168.0.1/80
将与192.168.0.1:80建立连接,并打开一个文件描述符“8”
我们在交互模式下执行上面的命令成功打开一个套接字后,
执行
ls -l /proc/self/fd
将会有类似下面的输出:
lrwx------ 1 zy zy 64 Oct 23 19:54 /proc/self/fd/8 ->
socket:[175669194]
可以看见Bash已经成功创建该套接字(或者使用 netstat -npt|grep "$$"
)
接下来我们向我们打开的套接字发送一个HEAD请求,并显示它:
echo -e "HEAD
/ HTTP/1.0\n\n" >&8
cat
<&8
输出类似如下:
HTTP/1.1 200 OK
Date: Thu, 23 Oct
2008 12:09:23 GMT
Server: Apache/1.3.41 (Unix) mod_gzip/1.3.26.1a
PHP/5.2.5
Last-Modified: Wed, 17 Sep 2008 11:51:45 GMT
ETag:
"239fe0-597-48d0ef51"
Accept-Ranges: bytes
Content-Length:
1431
Connection: close
Content-Type:
text/html
至此,我们已经达到进行简单套接字通信的目的。
以上这段是抄http://hi.baidu.com/test/blog/item/ef204f4aefbeb52509f7ef40.html
具体可以参考:
gawk's Networking Mechanisms
-----------------------------------------------
好了 开始自己的做法了
gawk支持gawk支持网络编程
/inet/tcp/lport/rhost/rport TCP协议通信
/inet/udp/lport/rhost/rport
UDP协议通信
/inet/raw/lport/rhost/rport 保留,将来可能gawk会支持raw套接字
lport:
local port,本地端口,一般做为客户端,我们不需要指定本地端口,使用'0'让系统来指定一个
rhost: remote
host,远程主机、主机名或IP地址
rport: remote
port,远程端口
参考:
Using gawk for Network Programming
#!/usr/bin/gawk -f
BEGIN{
RH=ARGV[1]
command=ARGV[2]
print "i am coming\n" |& RH;
RH |& getline
print $0;
print command |& RH;
RH |& getline
print $0;
print "i am gone\n" |& RH;
RH |& getline
print $0;
close(RH);
}
ok 这就完成了使用unix套接字编程了
可以参考
Using ARGC
and ARGV
对应的简单python是
import os
import sys
import socket
def getData(ip):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((ip,9505))
s.send('i am coming\n')
print s.recv(1024)
s.send('command')
print s.recv(1024)
s.send(i am gone\n')
print s.recv(1024)
s.close()
try:
if len(sys.argv)<1:
print 'please input parameter:ip'
exit
else:
ip=sys.argv[1]
print ip
getData(ip)
except:
print 'error'
阅读(559) | 评论(0) | 转发(0) |