📄 sockets.mht
字号:
<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-><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-><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 <SERVER><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-><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-><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->new<FONT color=3D#00ffff>();</FONT>
$select->add<FONT color=3D#00ffff>(</FONT>*FROM_SERVER<FONT =
color=3D#00ffff>);</FONT>
$select->add<FONT color=3D#00ffff>(</FONT>$to_client<FONT =
color=3D#00ffff>);</FONT>
<FONT color=3D#cdad00>@read_from</FONT> =3D $select->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 &TCP_NODELAY
</FONT>
<FONT color=3D#98fb98>setsockopt</FONT><FONT =
color=3D#00ffff>(</FONT>SERVER, SOL_SOCKET, &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, &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->new<FONT color=3D#00ffff>(</FONT><FONT =
color=3D#00cd00>Proto</FONT> =3D> <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 + -