writer:demonalex
email:demonalex_at_dark2s.org
使用PERL SOCKET API首先需要载入SOCKET模块。
use Socket;
======================================================================
socket(文件句柄,AF_INET,数据类型,协议类型);
#建立套接字
文件句柄随便找个词就可以了。
AF_INET为域类型,也可以写为PF_INET。
数据类型,通常用有两种:SOCK_STREAM、SOCK_DGRAM。
协议类型,可以用协议号代替,EGP---8、HMP---20、ICMP---1、
RAW---255、RDP---27、RVD---66、TCP---6、UDP---17、XNS-IDP---22、
其他---22、ALL---0;也可以用getprotobyname()函数作此参数。
例子:socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname('tcp'));
语柄为SOCK,套接字以TCP方式传输。
socket(SS,AF_INET,SOCK_DGRAM,17);
语柄为SS,套接字以UDP方式传输。
=======================================================================
connect(文件句柄,sockaddr_in结构体);
#连接主机
-----------------------------------------------
sockaddr_in结构体: |
| |
|$address=inet_aton(主机地址); |
|$port=端口号; |
| |
|$result=sockaddr_in($port,$address); |
| |
|#上面的$result就是sockaddr_in结构体,实例: |
| |
| |
| |
|$address=inet_aton(127.0.0.1); |
|$port=80; |
| |
| |
|$result=sockaddr_in($port,$address); |
| |
| |
-----------------------------------------------
例子:connect(SOCK,$result);
=======================================================================
bind(套接字,sockaddr_in结构体);
#绑定服务器主机地址与端口(用于服务端)
例子:bind(SOCK,$result);
=======================================================================
listen(套接字,等待连接最大队列数);
#设置端口状态为监听(用于服务端)
例子:listen(SOCK,10);
=======================================================================
accept(远程套接字,服务端监听套接字)
#接收远程数据请求,建立连接(用于服务端)
例子:accept(SESSION,SOCK);
=======================================================================
close(文件句柄);
或
close 文件句柄;
#关闭套接字
例子:close(SOCK);
close SS;
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
说说TCP的网络活动顺序:
=======================================================================
Client(客户端):
建立套接字socket()->连接到目标主机connect()->打开autoflush模式autoflush()->
I/O操作->关闭套接字close()
Server(服务器):
建立套接字socket()->绑定服务器地址与端口bind()->设置监听状态listen()->接受远程套接字accept()->
打开autoflush模式autoflush()->I/O操作->关闭套接字close()
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
PERL SOCKET API编程实例:
附:I/O操作暂时只使用print()与<>符号。
=======================================================================
#!usr/bin/perl
#客户端
use IO::Handle; #挂起IO::Handle
use Socket; #调用SOCKET
$port=80; #连接远程主机的80端口
$host='localhost'; #使用环回地址
$packhost=inet_aton($host); #压缩IP地址
$address=sockaddr_in($port,$packhost); #压成sockaddr_in格式
socket(CLIENT,AF_INET,SOCK_STREAM,6); #套接字为CLIENT,使用TCP协议
connect(CLIENT,$address); #连接
CLIENT->autoflush(1); #开启AUTOFLUSH模式
$msg_in=<CLIENT>; #INPUT
print "IN:$msg_in/n"; #OUTPUT
close CLIENT; #关闭套接字
exit 1; #退出程序
=======================================================================
#!usr/bin/perl
#服务端
use IO::Handle; #挂起IO::Handle
use Socket; #调用SOCKET
$port=80; #绑定的服务器主机端口为80
$address=sockaddr_in($port,INADDR_ANY); #压成sockaddr_in格式,使用INADDR_ANY通配符
socket(SERVER,AF_INET,SOCK_STREAM,getprotobyname('tcp')); #套接字为SERVER,使用TCP协议
bind(SERVER,$address); #绑定
listen(SERVER,10); #设置监听状态
while(1){ #进入I/O交换循环体
next unless (accept(CLIENT,SERVER));
CLIENT->autoflush(1);
print CLIENT "WHAT DO YOU WANT?/n";
close CLIENT;}
close SERVER; #关闭套接字
exit 1; #退出程序
=======================================================================
实例注解:
1)TCP的client与server代码中有一行'SOCK->autoflush(1);',正常情况下下面的I/O代码是会先进入缓存,
再输出的,但加了上面的代码就可以跳过这一步直接输出了。此代码需要预先加载IO::Handle。
2)INADDR_ANY通配符的值在Socket模块中已经定义了,其值为本地网络适配的所有网络接口(包括环回地址、
广播地址、多播地址等)。
◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
头有点痛,写到这里,下回介绍send()与recv()........:P
email:demonalex_at_dark2s.org
使用PERL SOCKET API首先需要载入SOCKET模块。
use Socket;
======================================================================
socket(文件句柄,AF_INET,数据类型,协议类型);
#建立套接字
文件句柄随便找个词就可以了。
AF_INET为域类型,也可以写为PF_INET。
数据类型,通常用有两种:SOCK_STREAM、SOCK_DGRAM。
协议类型,可以用协议号代替,EGP---8、HMP---20、ICMP---1、
RAW---255、RDP---27、RVD---66、TCP---6、UDP---17、XNS-IDP---22、
其他---22、ALL---0;也可以用getprotobyname()函数作此参数。
例子:socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname('tcp'));
语柄为SOCK,套接字以TCP方式传输。
socket(SS,AF_INET,SOCK_DGRAM,17);
语柄为SS,套接字以UDP方式传输。
=======================================================================
connect(文件句柄,sockaddr_in结构体);
#连接主机
-----------------------------------------------
sockaddr_in结构体: |
| |
|$address=inet_aton(主机地址); |
|$port=端口号; |
| |
|$result=sockaddr_in($port,$address); |
| |
|#上面的$result就是sockaddr_in结构体,实例: |
| |
| |
| |
|$address=inet_aton(127.0.0.1); |
|$port=80; |
| |
| |
|$result=sockaddr_in($port,$address); |
| |
| |
-----------------------------------------------
例子:connect(SOCK,$result);
=======================================================================
bind(套接字,sockaddr_in结构体);
#绑定服务器主机地址与端口(用于服务端)
例子:bind(SOCK,$result);
=======================================================================
listen(套接字,等待连接最大队列数);
#设置端口状态为监听(用于服务端)
例子:listen(SOCK,10);
=======================================================================
accept(远程套接字,服务端监听套接字)
#接收远程数据请求,建立连接(用于服务端)
例子:accept(SESSION,SOCK);
=======================================================================
close(文件句柄);
或
close 文件句柄;
#关闭套接字
例子:close(SOCK);
close SS;
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
说说TCP的网络活动顺序:
=======================================================================
Client(客户端):
建立套接字socket()->连接到目标主机connect()->打开autoflush模式autoflush()->
I/O操作->关闭套接字close()
Server(服务器):
建立套接字socket()->绑定服务器地址与端口bind()->设置监听状态listen()->接受远程套接字accept()->
打开autoflush模式autoflush()->I/O操作->关闭套接字close()
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
PERL SOCKET API编程实例:
附:I/O操作暂时只使用print()与<>符号。
=======================================================================
#!usr/bin/perl
#客户端
use IO::Handle; #挂起IO::Handle
use Socket; #调用SOCKET
$port=80; #连接远程主机的80端口
$host='localhost'; #使用环回地址
$packhost=inet_aton($host); #压缩IP地址
$address=sockaddr_in($port,$packhost); #压成sockaddr_in格式
socket(CLIENT,AF_INET,SOCK_STREAM,6); #套接字为CLIENT,使用TCP协议
connect(CLIENT,$address); #连接
CLIENT->autoflush(1); #开启AUTOFLUSH模式
$msg_in=<CLIENT>; #INPUT
print "IN:$msg_in/n"; #OUTPUT
close CLIENT; #关闭套接字
exit 1; #退出程序
=======================================================================
#!usr/bin/perl
#服务端
use IO::Handle; #挂起IO::Handle
use Socket; #调用SOCKET
$port=80; #绑定的服务器主机端口为80
$address=sockaddr_in($port,INADDR_ANY); #压成sockaddr_in格式,使用INADDR_ANY通配符
socket(SERVER,AF_INET,SOCK_STREAM,getprotobyname('tcp')); #套接字为SERVER,使用TCP协议
bind(SERVER,$address); #绑定
listen(SERVER,10); #设置监听状态
while(1){ #进入I/O交换循环体
next unless (accept(CLIENT,SERVER));
CLIENT->autoflush(1);
print CLIENT "WHAT DO YOU WANT?/n";
close CLIENT;}
close SERVER; #关闭套接字
exit 1; #退出程序
=======================================================================
实例注解:
1)TCP的client与server代码中有一行'SOCK->autoflush(1);',正常情况下下面的I/O代码是会先进入缓存,
再输出的,但加了上面的代码就可以跳过这一步直接输出了。此代码需要预先加载IO::Handle。
2)INADDR_ANY通配符的值在Socket模块中已经定义了,其值为本地网络适配的所有网络接口(包括环回地址、
广播地址、多播地址等)。
◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
头有点痛,写到这里,下回介绍send()与recv()........:P