Skip to content

Commit 2930520

Browse files
authored
[Sync EN] socket_atmark: rewrite example to demonstrate OOB read (#632)
1 parent f4832ba commit 2930520

1 file changed

Lines changed: 43 additions & 7 deletions

File tree

reference/sockets/functions/socket-atmark.xml

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<!-- EN-Revision: eef7fb60d16864b253aa3aa95a57f8b1cfd41451 Maintainer: PhilDaiguille Status: ready -->
2+
<!-- EN-Revision: 2c357a0dd6cc195bce10fa974ea14a2e30eb4b5b Maintainer: lacatoire Status: ready -->
33
<!-- Reviewed: yes -->
44
<refentry xml:id="function.socket-atmark" xmlns="http://docbook.org/ns/docbook">
55
<refnamediv>
@@ -45,18 +45,54 @@
4545
&reftitle.examples;
4646
<para>
4747
<example>
48-
<title>Uso de <function>socket_atmark</function> para definir la dirección fuente</title>
48+
<title>Uso de <function>socket_atmark</function> para comprobar si el socket está listo para leer datos fuera de banda.</title>
4949
<programlisting role="php">
5050
<![CDATA[
5151
<?php
52-
// Crear un nuevo socket
53-
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
54-
var_dump(socket_atmark($sock));
55-
// Cerrar
56-
socket_close($sock);
52+
$socketServer = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
53+
socket_set_option( $socketServer, SOL_SOCKET, SO_REUSEADDR, 1 );
54+
socket_bind( $socketServer, '127.0.0.1' );
55+
socket_listen( $socketServer );
56+
57+
$socketClient = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
58+
socket_getsockname( $socketServer, $stAddr, $uPort );
59+
socket_connect( $socketClient, $stAddr, $uPort );
60+
61+
$socket = socket_accept( $socketServer );
62+
socket_shutdown( $socket, 1 );
63+
64+
$st = 'Estos son datos normales.';
65+
socket_send( $socketClient, $st, strlen( $st ), 0 );
66+
$st = '!'; # TCP solo permite un byte de datos urgentes.
67+
socket_send( $socketClient, $st, strlen( $st ), MSG_OOB );
68+
$st = 'No tan urgente.';
69+
socket_send( $socketClient, $st, strlen( $st ), 0 );
70+
socket_shutdown( $socketClient );
71+
72+
do {
73+
if ( socket_atmark( $socket ) ) {
74+
$rc = socket_recv( $socket, $st, 65536, MSG_OOB );
75+
echo "Datos urgentes recibidos: ({$rc}) {$st}\n";
76+
} else {
77+
$rc = socket_recv( $socket, $st, 1024, 0 );
78+
echo "Datos normales recibidos: ({$rc}) {$st}\n";
79+
}
80+
} while ( $rc > 0 );
81+
socket_close( $socketServer );
82+
socket_close( $socketClient );
83+
socket_close( $socket );
5784
?>
5885
]]>
5986
</programlisting>
87+
&example.outputs;
88+
<screen>
89+
<![CDATA[
90+
Datos normales recibidos: (25) Estos son datos normales.
91+
Datos urgentes recibidos: (1) !
92+
Datos normales recibidos: (15) No tan urgente.
93+
Datos normales recibidos: (0)
94+
]]>
95+
</screen>
6096
</example>
6197
</para>
6298
</refsect1>

0 commit comments

Comments
 (0)