Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54990
  • 博文数量: 28
  • 博客积分: 84
  • 博客等级: 民兵
  • 技术积分: 162
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 17:47
个人简介

try vuuv.github.io or somewhere else.

文章分类

全部博文(28)

文章存档

2013年(1)

2012年(5)

2011年(22)

我的朋友

分类:

2012-11-13 20:39:54

--------------------------------------
在用于重定向时,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'



阅读(524) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~