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

📄 sockets.mht

📁 Perl 编程技巧大全。适合初学者阅读。
💻 MHT
📖 第 1 页 / 共 5 页
字号:
<FONT color=3D#bebebe># establish a queue for incoming connections
</FONT><FONT color=3D#98fb98>listen</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, SOMAXCONN<FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Couldn't listen on port $server_port : =
$!\n"</FONT><FONT color=3D#00ffff>;</FONT>

<FONT color=3D#bebebe># accept and process connections
</FONT><FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#98fb98>accept</FONT><FONT =
color=3D#00ffff>(</FONT>CLIENT, SERVER<FONT color=3D#00ffff>))</FONT> =
<FONT color=3D#00ffff>{</FONT>
    <FONT color=3D#bebebe># do something with CLIENT
</FONT><FONT color=3D#00ffff>}</FONT>

<FONT color=3D#98fb98>close</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER<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>

<FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT>$client_address =3D <FONT =
color=3D#98fb98>accept</FONT><FONT color=3D#00ffff>(</FONT>CLIENT, =
SERVER<FONT color=3D#00ffff>))</FONT> <FONT color=3D#00ffff>{</FONT>
    <FONT color=3D#00ffff>(</FONT>$port, $packed_ip<FONT =
color=3D#00ffff>)</FONT> =3D sockaddr_in<FONT =
color=3D#00ffff>(</FONT>$client_address<FONT color=3D#00ffff>);</FONT>
    $dotted_quad =3D inet_ntoa<FONT =
color=3D#00ffff>(</FONT>$packed_ip<FONT color=3D#00ffff>);</FONT>
    <FONT color=3D#bebebe># do as thou wilt
</FONT><FONT color=3D#00ffff>}</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT>$client =3D $server-&gt;<FONT =
color=3D#98fb98>accept</FONT><FONT color=3D#00ffff>())</FONT> <FONT =
color=3D#00ffff>{</FONT>
    <FONT color=3D#bebebe># ...
</FONT><FONT color=3D#00ffff>}</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>((</FONT>$client,$client_address<FONT =
color=3D#00ffff>)</FONT> =3D $server-&gt;<FONT =
color=3D#98fb98>accept</FONT><FONT color=3D#00ffff>())</FONT> <FONT =
color=3D#00ffff>{</FONT>
    <FONT color=3D#bebebe># ...
</FONT><FONT color=3D#00ffff>}</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>Fcntl</FONT> <FONT color=3D#ff7f50>qw</FONT><FONT =
color=3D#00ffff>(</FONT>F_GETFL F_SETFL O_NONBLOCK<FONT =
color=3D#00ffff>);</FONT>

$flags =3D <FONT color=3D#98fb98>fcntl</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, F_GETFL, <FONT =
color=3D#cdcd00>0</FONT><FONT color=3D#00ffff>)</FONT>
            <FONT color=3D#98fb98>or</FONT> <FONT =
color=3D#ffa500>die</FONT> <FONT color=3D#00cd00>"Can't get flags for =
the socket: $!\n"</FONT><FONT color=3D#00ffff>;</FONT>

$flags =3D <FONT color=3D#98fb98>fcntl</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, F_SETFL, $flags | O_NONBLOCK<FONT =
color=3D#00ffff>)</FONT>
            <FONT color=3D#98fb98>or</FONT> <FONT =
color=3D#ffa500>die</FONT> <FONT color=3D#00cd00>"Can't set flags for =
the socket: $!\n"</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=3DAEN928>Communicating over TCP</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#ff7f50>print</FONT> SERVER <FONT =
color=3D#00cd00>"What is your name?\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#ff7f50>chomp</FONT> <FONT =
color=3D#00ffff>(</FONT>$response =3D &lt;SERVER&gt;<FONT =
color=3D#00ffff>);</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ff7f50>defined</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#98fb98>send</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, $data_to_<FONT =
color=3D#98fb98>send</FONT>, $flags<FONT color=3D#00ffff>))</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't send : $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>

<FONT color=3D#98fb98>recv</FONT><FONT color=3D#00ffff>(</FONT>SERVER, =
$data_<FONT color=3D#98fb98>read</FONT>, $maxlen, $flags<FONT =
color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't receive: $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>IO::Socket</FONT><FONT color=3D#00ffff>;</FONT>

$server-&gt;<FONT color=3D#98fb98>send</FONT><FONT =
color=3D#00ffff>(</FONT>$data_to_<FONT color=3D#98fb98>send</FONT>, =
$flags<FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't send: $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>

$server-&gt;<FONT color=3D#98fb98>recv</FONT><FONT =
color=3D#00ffff>(</FONT>$data_<FONT color=3D#98fb98>read</FONT>, =
$flags<FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't recv: $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>IO::Select</FONT><FONT color=3D#00ffff>;</FONT>

$select =3D IO::Select-&gt;new<FONT color=3D#00ffff>();</FONT>
$select-&gt;add<FONT color=3D#00ffff>(</FONT>*FROM_SERVER<FONT =
color=3D#00ffff>);</FONT>
$select-&gt;add<FONT color=3D#00ffff>(</FONT>$to_client<FONT =
color=3D#00ffff>);</FONT>

<FONT color=3D#cdad00>@read_from</FONT> =3D $select-&gt;can_<FONT =
color=3D#98fb98>read</FONT><FONT color=3D#00ffff>(</FONT>$timeout<FONT =
color=3D#00ffff>);</FONT>
<FONT color=3D#ffa500>foreach</FONT> <FONT =
color=3D#9ac0cd>$socket</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdad00>@read_from</FONT><FONT color=3D#00ffff>)</FONT> <FONT =
color=3D#00ffff>{</FONT>
    <FONT color=3D#bebebe># read the pending data from $socket
</FONT><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>
<FONT color=3D#ffa500>require</FONT> <FONT =
color=3D#00cd00>"sys/socket.ph"</FONT><FONT color=3D#00ffff>;</FONT>    =
<FONT color=3D#bebebe># for &amp;TCP_NODELAY
</FONT>
<FONT color=3D#98fb98>setsockopt</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, SOL_SOCKET, &amp;TCP_NODELAY, <FONT =
color=3D#cdcd00>1</FONT><FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Couldn't disable Nagle's algorithm: =
$!\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#98fb98>setsockopt</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, SOL_SOCKET, &amp;TCP_NODELAY, <FONT =
color=3D#cdcd00>0</FONT><FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Couldn't enable Nagle's algorithm: =
$!\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT>$rin =3D <FONT color=3D#00cd00>''</FONT><FONT =
color=3D#00ffff>;</FONT>                          <FONT =
color=3D#bebebe># initialize bitmask
</FONT><FONT color=3D#98fb98>vec</FONT><FONT =
color=3D#00ffff>(</FONT>$rin, <FONT color=3D#98fb98>fileno</FONT><FONT =
color=3D#00ffff>(</FONT>SOCKET<FONT color=3D#00ffff>)</FONT>, <FONT =
color=3D#cdcd00>1</FONT><FONT color=3D#00ffff>)</FONT> =3D <FONT =
color=3D#cdcd00>1</FONT><FONT color=3D#00ffff>;</FONT>   <FONT =
color=3D#bebebe># mark SOCKET in $rin
# repeat calls to vec() for each socket to check
</FONT>
$timeout =3D <FONT color=3D#cdcd00>10</FONT><FONT =
color=3D#00ffff>;</FONT>                      <FONT color=3D#bebebe># =
wait ten seconds
</FONT>
$nfound =3D <FONT color=3D#98fb98>select</FONT><FONT =
color=3D#00ffff>(</FONT>$rout =3D $rin, <FONT =
color=3D#ff7f50>undef</FONT>, <FONT color=3D#ff7f50>undef</FONT>, =
$timeout<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ffa500>if</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#98fb98>vec</FONT><FONT color=3D#00ffff>(</FONT>$rout, <FONT =
color=3D#98fb98>fileno</FONT><FONT color=3D#00ffff>(</FONT>SOCKET<FONT =
color=3D#00ffff>)</FONT>,<FONT color=3D#cdcd00>1</FONT><FONT =
color=3D#00ffff>)){</FONT>
    <FONT color=3D#bebebe># data to be read on SOCKET
</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=3DAEN931>Setting Up a UDP Client</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>
<FONT color=3D#98fb98>socket</FONT><FONT color=3D#00ffff>(</FONT>SOCKET, =
PF_INET, SOCK_DGRAM, <FONT color=3D#98fb98>getprotobyname</FONT><FONT =
color=3D#00ffff>(</FONT><FONT color=3D#00cd00>"udp"</FONT><FONT =
color=3D#00ffff>))</FONT><FONT color=3D#43cd80> </FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"socket: $!"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>IO::Socket</FONT><FONT color=3D#00ffff>;</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>'udp'</FONT><FONT color=3D#00ffff>)</FONT><FONT =
color=3D#43cd80> </FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"socket: $@"</FONT><FONT color=3D#00ffff>;</FONT>  =
   <FONT color=3D#bebebe># yes, it uses $@ here
#-----------------------------
</FONT>$ipaddr   =3D inet_aton<FONT =
color=3D#00ffff>(</FONT>$HOSTNAME<FONT color=3D#00ffff>);</FONT>
$portaddr =3D sockaddr_in<FONT color=3D#00ffff>(</FONT>$PORTNO, =
$ipaddr<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#98fb98>send</FONT><FONT color=3D#00ffff>(</FONT>SOCKET, =
$MSG, <FONT color=3D#cdcd00>0</FONT>, $portaddr<FONT =
color=3D#00ffff>)</FONT> =3D=3D <FONT color=3D#98fb98>length</FONT><FONT =
color=3D#00ffff>(</FONT>$MSG<FONT color=3D#00ffff>)</FONT>
        <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"cannot send to $HOSTNAME($PORTNO): =
$!"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT>$portaddr =3D <FONT color=3D#98fb98>recv</FONT><FONT =
color=3D#00ffff>(</FONT>SOCKET, $MSG, $MAXLEN, <FONT =
color=3D#cdcd00>0</FONT><FONT color=3D#00ffff>)</FONT>      <FONT =
color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> <FONT =
color=3D#00cd00>"recv: $!"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>(</FONT>$portno, $ipaddr<FONT =
color=3D#00ffff>)</FONT> =3D sockaddr_in<FONT =
color=3D#00ffff>(</FONT>$portaddr<FONT color=3D#00ffff>);</FONT>
$host =3D <FONT color=3D#98fb98>gethostbyaddr</FONT><FONT =
color=3D#00ffff>(</FONT>$ipaddr, AF_INET<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$host($portno) =
said $MSG\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#98fb98>send</FONT><FONT =
color=3D#00ffff>(</FONT>MYSOCKET, $msg_buffer, $flags, $remote_addr<FONT =
color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't send: $!\n"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
# <FONT size=3D-1><A =
href=3D"http://pleac.sourceforge.net/include/perl/ch17/clockdrift">downlo=
ad the following standalone program</A></FONT>
#!/usr/bin/perl
# clockdrift - compare another system's clock with this one
</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>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>$him</FONT>, <FONT =
color=3D#9ac0cd>$src</FONT>, <FONT color=3D#9ac0cd>$port</FONT>, <FONT =
color=3D#9ac0cd>$ipaddr</FONT>, <FONT color=3D#9ac0cd>$ptime</FONT>, =
<FONT color=3D#9ac0cd>$delta</FONT><FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ffa500>my</FONT> <FONT =
color=3D#9ac0cd>$SECS_of_70_YEARS</FONT>      =3D <FONT =

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -