📄 sockets.mht
字号:
<FONT color=3D#00cd00>"Can't connect to /tmp/mysock: $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN940>Identifying the Other End of a =
Socket</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>Socket</FONT><FONT color=3D#00ffff>;</FONT>
$other_end =3D <FONT color=3D#98fb98>getpeername</FONT><FONT =
color=3D#00ffff>(</FONT>SOCKET<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Couldn't identify other end: $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>(</FONT>$port, $iaddr<FONT =
color=3D#00ffff>)</FONT> =3D <FONT =
color=3D#98fb98>unpack</FONT>_sockaddr_in<FONT =
color=3D#00ffff>(</FONT>$other_end<FONT color=3D#00ffff>);</FONT>
$ip_address =3D inet_ntoa<FONT =
color=3D#00ffff>(</FONT>$iaddr<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>Socket</FONT><FONT color=3D#00ffff>;</FONT>
$other_end =3D <FONT color=3D#98fb98>getpeername</FONT><FONT =
color=3D#00ffff>(</FONT>SOCKET<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Couldn't identify other end: $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>(</FONT>$port, $iaddr<FONT =
color=3D#00ffff>)</FONT> =3D <FONT =
color=3D#98fb98>unpack</FONT>_sockaddr_in<FONT =
color=3D#00ffff>(</FONT>$other_end<FONT color=3D#00ffff>);</FONT>
$actual_ip =3D inet_ntoa<FONT color=3D#00ffff>(</FONT>$iaddr<FONT =
color=3D#00ffff>);</FONT>
$claimed_hostname =3D <FONT color=3D#98fb98>gethostbyaddr</FONT><FONT =
color=3D#00ffff>(</FONT>$iaddr, AF_INET<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#cdad00>@name_lookup</FONT> =3D <FONT =
color=3D#98fb98>gethostbyname</FONT><FONT =
color=3D#00ffff>(</FONT>$claimed_hostname<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Could not look up $claimed_hostname : =
$!\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#cdad00>@resolved_ips</FONT> =3D <FONT =
color=3D#ff7f50>map</FONT> <FONT color=3D#00ffff>{</FONT> inet_ntoa<FONT =
color=3D#00ffff>(</FONT>$_<FONT color=3D#00ffff>)</FONT> <FONT =
color=3D#00ffff>}</FONT>
<FONT color=3D#cdad00>@name_lookup</FONT><FONT =
color=3D#00ffff>[</FONT> <FONT color=3D#cdcd00>4</FONT> .. <FONT =
color=3D#cdad00>$#ips_for_hostname</FONT> <FONT =
color=3D#00ffff>];</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT>$packed_ip =3D <FONT color=3D#98fb98>gethostbyname</FONT><FONT =
color=3D#00ffff>(</FONT>$name<FONT color=3D#00ffff>)</FONT> <FONT =
color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> <FONT =
color=3D#00cd00>"Couldn't look up $name : $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
$ip_address =3D inet_ntoa<FONT color=3D#00ffff>(</FONT>$packed_ip<FONT =
color=3D#00ffff>);</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN943>Finding Your Own Name and =
Address</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>Sys::Hostname</FONT><FONT color=3D#00ffff>;</FONT>
$hostname =3D hostname<FONT color=3D#00ffff>();</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>POSIX</FONT> <FONT color=3D#ff7f50>qw</FONT><FONT =
color=3D#00ffff>(</FONT>uname<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#00ffff>(</FONT>$kernel, $hostname, $release, $version, =
$hardware<FONT color=3D#00ffff>)</FONT> =3D uname<FONT =
color=3D#00ffff>();</FONT>
$hostname =3D <FONT color=3D#00ffff>(</FONT>uname<FONT =
color=3D#00ffff>)[</FONT><FONT color=3D#cdcd00>1</FONT><FONT =
color=3D#00ffff>];</FONT> <FONT color=3D#bebebe># or just =
one
#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>Socket</FONT><FONT color=3D#00ffff>;</FONT> =
<FONT color=3D#bebebe># for AF_INET
</FONT>$address =3D <FONT color=3D#98fb98>gethostbyname</FONT><FONT =
color=3D#00ffff>(</FONT>$hostname<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Couldn't resolve $hostname : $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
$hostname =3D <FONT color=3D#98fb98>gethostbyaddr</FONT><FONT =
color=3D#00ffff>(</FONT>$address, AF_INET<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Couldn't re-resolve $hostname : $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN946>Closing a Socket After =
Forking</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#98fb98>shutdown</FONT><FONT =
color=3D#00ffff>(</FONT>SOCKET, <FONT color=3D#cdcd00>0</FONT><FONT =
color=3D#00ffff>);</FONT> <FONT color=3D#bebebe># I/we =
have stopped reading data
</FONT><FONT color=3D#98fb98>shutdown</FONT><FONT =
color=3D#00ffff>(</FONT>SOCKET, <FONT color=3D#cdcd00>1</FONT><FONT =
color=3D#00ffff>);</FONT> <FONT color=3D#bebebe># I/we =
have stopped writing data
</FONT><FONT color=3D#98fb98>shutdown</FONT><FONT =
color=3D#00ffff>(</FONT>SOCKET, <FONT color=3D#cdcd00>2</FONT><FONT =
color=3D#00ffff>);</FONT> <FONT color=3D#bebebe># I/we =
have stopped using this socket
#-----------------------------
</FONT>$socket-><FONT color=3D#98fb98>shutdown</FONT><FONT =
color=3D#00ffff>(</FONT><FONT color=3D#cdcd00>0</FONT><FONT =
color=3D#00ffff>);</FONT> <FONT color=3D#bebebe># I/we =
have stopped reading data
#-----------------------------
</FONT><FONT color=3D#ff7f50>print</FONT> SERVER <FONT =
color=3D#00cd00>"my request\n"</FONT><FONT color=3D#00ffff>;</FONT> =
<FONT color=3D#bebebe># send some data
</FONT><FONT color=3D#98fb98>shutdown</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, <FONT color=3D#cdcd00>1</FONT><FONT =
color=3D#00ffff>);</FONT> <FONT color=3D#bebebe># send =
eof; no more writing
</FONT>$answer =3D <SERVER><FONT color=3D#00ffff>;</FONT> =
<FONT color=3D#bebebe># but you can still read
#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN949>Writing Bidirectional =
Clients</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
# <FONT size=3D-1><A =
href=3D"http://pleac.sourceforge.net/include/perl/ch17/biclient">download=
the following standalone program</A></FONT>
#!/usr/bin/perl -w
# biclient - bidirectional forking client
</FONT> <FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>strict</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>IO::Socket</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$host</FONT>, <FONT color=3D#9ac0cd>$port</FONT>, <FONT =
color=3D#9ac0cd>$kidpid</FONT>, <FONT color=3D#9ac0cd>$handle</FONT>, =
<FONT color=3D#9ac0cd>$line</FONT><FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ffa500>unless</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdad00>@ARGV</FONT> =3D=3D <FONT color=3D#cdcd00>2</FONT><FONT =
color=3D#00ffff>)</FONT> <FONT color=3D#00ffff>{</FONT> <FONT =
color=3D#ffa500>die</FONT> <FONT color=3D#00cd00>"usage: $0 host =
port"</FONT> <FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>(</FONT>$host, $port<FONT color=3D#00ffff>)</FONT> =
=3D <FONT color=3D#cdad00>@ARGV</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe># create a tcp connection to the specified host =
and port
</FONT>$handle =3D IO::Socket::INET->new<FONT =
color=3D#00ffff>(</FONT><FONT color=3D#00cd00>Proto</FONT> =3D> =
<FONT color=3D#00cd00>"tcp"</FONT>,
<FONT color=3D#00cd00>PeerAddr</FONT> =
=3D> $host,
<FONT color=3D#00cd00>PeerPort</FONT> =
=3D> $port<FONT color=3D#00ffff>)</FONT>
<FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"can't connect to port $port on $host: =
$!"</FONT><FONT color=3D#00ffff>;</FONT>
$handle->autoflush<FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdcd00>1</FONT><FONT color=3D#00ffff>);</FONT> =
<FONT color=3D#bebebe># so output gets there right away
</FONT><FONT color=3D#ff7f50>print</FONT> STDERR <FONT =
color=3D#00cd00>"[Connected to $host:$port]\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe># split the program into two processes, identical =
twins
</FONT><FONT color=3D#ffa500>die</FONT> <FONT color=3D#00cd00>"can't =
fork: $!"</FONT> <FONT color=3D#ffa500>unless</FONT> <FONT =
color=3D#ff7f50>defined</FONT><FONT color=3D#00ffff>(</FONT>$kidpid =3D =
<FONT color=3D#98fb98>fork</FONT><FONT color=3D#00ffff>());</FONT>
<FONT color=3D#ffa500>if</FONT> <FONT =
color=3D#00ffff>(</FONT>$kidpid<FONT color=3D#00ffff>)</FONT> <FONT =
color=3D#00ffff>{</FONT><FONT color=3D#43cd80> =
</FONT>
<FONT color=3D#bebebe># parent copies the socket to standard output
</FONT> <FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ff7f50>defined</FONT> <FONT =
color=3D#00ffff>(</FONT>$line =3D <$handle><FONT =
color=3D#00ffff>))</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#ff7f50>print</FONT> STDOUT $line<FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#98fb98>kill</FONT><FONT color=3D#00ffff>(</FONT><FONT =
color=3D#00cd00>"TERM"</FONT> =3D> $kidpid<FONT =
color=3D#00ffff>);</FONT> <FONT color=3D#bebebe># send SIGTERM to =
child
</FONT><FONT color=3D#00ffff>}</FONT>
<FONT color=3D#ffa500>else</FONT> <FONT color=3D#00ffff>{</FONT><FONT =
color=3D#43cd80> </FONT>
<FONT color=3D#bebebe># child copies standard input to the socket
</FONT> <FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ff7f50>defined</FONT> <FONT =
color=3D#00ffff>(</FONT>$line =3D <STDIN><FONT =
color=3D#00ffff>))</FONT> <FONT color=3D#00ffff>{</FONT>
<FONT color=3D#ff7f50>print</FONT> $handle $line<FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#ffa500>exit</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>my</FONT> <FONT =
color=3D#9ac0cd>$byte</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>while</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#98fb98>sysread</FONT><FONT color=3D#00ffff>(</FONT>$handle, =
$byte, <FONT color=3D#cdcd00>1</FONT><FONT color=3D#00ffff>)</FONT> =
=3D=3D <FONT color=3D#cdcd00>1</FONT><FONT color=3D#00ffff>)</FONT> =
<FONT color=3D#00ffff>{</FONT>
<FONT color=3D#ff7f50>print</FONT> STDOUT $byte<FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN952>Forking Servers</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
<TBODY>
<TR>
<TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
# set up the socket SERVER, bind and listen ...
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>POSIX</FONT> <FONT color=3D#ff7f50>qw</FONT><FONT =
color=3D#00ffff>(</FONT>:sys_<FONT color=3D#98fb98>wait</FONT>_h<FONT =
color=3D#00ffff>);</FONT>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -