⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockets.mht

📁 Perl 编程技巧大全。适合初学者阅读。
💻 MHT
📖 第 1 页 / 共 5 页
字号:
<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-&gt;<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 &lt;SERVER&gt;<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-&gt;new<FONT =
color=3D#00ffff>(</FONT><FONT color=3D#00cd00>Proto</FONT>     =3D&gt; =
<FONT color=3D#00cd00>"tcp"</FONT>,
                                <FONT color=3D#00cd00>PeerAddr</FONT>  =
=3D&gt; $host,
                                <FONT color=3D#00cd00>PeerPort</FONT>  =
=3D&gt; $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-&gt;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 &lt;$handle&gt;<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&gt; $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 &lt;STDIN&gt;<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 + -