XCVIIソケット関数
è¦å‘Š |
ã“ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ã€å®Ÿé¨“çš„ãªã‚‚ã®ã§ã™ã€‚ã“れã¯ã€ã“れらã®é–¢æ•°ã®å‹•作ã€é–¢æ•°åã¯ã€ã“ã®ãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ›¸ã‹ã‚Œã¦äº‹é …ã¨åŒæ§˜ã«å‘ŠçŸ¥ãªãå°†æ¥çš„ãªPHPã®ãƒªãƒªãƒ¼ã‚¹ã§å¤‰æ›´ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚注æ„ã‚’å–šèµ·ã™ã‚‹ã¨ã¨ã‚‚ã«ã€ã“ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ä½¿ç”¨è€…ã®ãƒªã‚¹ã‚¯ã§ä½¿ç”¨ã—ã¦ä¸‹ã•ã„。 |
ソケット拡張ã«ã‚ˆã‚Šã€ã‚½ã‚±ãƒƒãƒˆé€šä¿¡é–¢æ•°ã¸ã®ä½Žãƒ¬ãƒ™ãƒ«ãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェース
ãŒå®Ÿè£…ã•れã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã—ã¦ã ã‘ã§ãªãã€ã‚½ã‚±ãƒƒãƒˆã‚µãƒ¼ãƒãƒ¼ã¨ã—ã¦å‹•
作ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
ã“ã“ã«æ—¢è¿°ã•れãŸã‚½ã‚±ãƒƒãƒˆé–¢æ•°ã¯PHP拡張モジュールã®ä¸€éƒ¨ã§ã‚りã€ã‚³ãƒ³
パイル時ã«configureã«ã‚ªãƒ—ション--enable-socketsを指定ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šä½¿ç”¨
å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
より一般的ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚µã‚¤ãƒ‰ã®ã‚½ã‚±ãƒƒãƒˆã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースã«ã¤ã„ã¦ã¯ã€
fsockopen() ãŠã‚ˆã³
pfsockopen()ã‚’å‚照下ã•ã„。
ã“ã“ã§èª¬æ˜Žã™ã‚‹ã‚½ã‚±ãƒƒãƒˆé–¢æ•°ã‚’使用ã™ã‚‹å ´åˆã€å¤šãã®é–¢æ•°ã¯ã€C言語ã«åŒ
ã˜åå‰ã®é–¢æ•°ãŒå˜åœ¨ã—ã¾ã™ãŒã€å®šç¾©ãŒç•°ãªã£ã¦ã„ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ä¸‹ã•ã„。
混乱をé¿ã‘ã‚‹ã«ã¯ã€èª¬æ˜Žã‚’よãèªã‚“ã§ä¸‹ã•ã„。
ã“ã®ã‚ˆã†ã«ã‚½ã‚±ãƒƒãƒˆã‚½ã‚±ãƒƒãƒˆãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã¨ç•°ãªã£ã¦ã„る点ã¯ã‚りã¾ã™
ãŒã€ãれã§ã‚‚有用ãªå¤šãã®UNIX man ページをå‚ç…§ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
Web上ã«C言語ã®ã‚½ã‚±ãƒƒãƒˆãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«æƒ…å ±ãŒå˜åœ¨ã—ã€
ãã®å¤šãã¯ã€è‹¥å¹²ã®ä¿®æ£ã«ã‚ˆã‚Šã€PHPã«ãŠã‘るソケットプãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã«
é©å½“ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
例 1ソケットã®ä¾‹: 簡易TCP/IPサーãƒãƒ¼
ã“ã®ä¾‹ã¯ã€ç°¡å˜ãªå¿œç”サーãƒãƒ¼ã§ã™ã€‚変数address
ã¨portã‚’è¨å®šã¨å®Ÿè¡Œç’°å¢ƒã«åˆã†ã‚ˆã†ã«å¤‰æ›´ã—ã¦ä¸‹
ã•ã„。ã“ã®ã‚µãƒ¼ãƒãƒ¼ã«æ¬¡ã®ã‚ˆã†ãªã‚³ãƒžãƒ³ãƒ‰ã§æŽ¥ç¶šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
: telnet 192.168.1.53 10000 (ãŸã ã—ã€ã‚¢ãƒ‰ãƒ¬ã‚¹
ã¨ãƒãƒ¼ãƒˆã¯è¨å®šã«åˆã‚ã›ã¾ã™)入力ã—ãŸã‚‚ã®ã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã®å‡ºåŠ›ã¨ãª
りã€ã‚¨ã‚³ãƒ¼ãƒãƒƒã‚¯ã•れã¾ã™ã€‚接続を閉ã˜ã‚‹ã«ã¯ã€'quit'を入力ã—ã¾ã™ã€‚
<?php
error_reporting (E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit (0);
$address = '192.168.1.53';
$port = 10000;
if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
}
if (($ret = socket_bind ($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
}
if (($ret = socket_listen ($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
}
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n";
break;
}
do {
$buf = socket_read ($msgsock, 2048);
if ($buf == FALSE) {
echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n";
break 2;
}
if (!$buf) {
break 2;
}
$buf = trim ($buf);
if ($buf == 'quit') {
socket_close ($msgsock);
break 2;
}
$talkback = "PHP: You said '$buf'.\n";
socket_write ($msgsock, $talkback, strlen ($talkback));
echo "$buf\n";
} while (true);
socket_close ($msgsock);
} while (true);
socket_close ($sock);
?> |
|
例 2ソケットã®ä¾‹: 簡易 TCP/IP クライアント
ã“ã®ä¾‹ã¯ã€ç°¡å˜ãªä¸€å›žé™ã‚Šã®HTTPクライアントã§ã™ã€‚ã“ã“ã§ã¯ã€ã‚るペー
ã‚¸ã«æŽ¥ç¶šã—ã€HEADリクエストをé€ä¿¡ã—ã€å¿œç”を出力ãŸå¾Œã€çµ‚了ã—ã¾ã™ã€‚
<?php
error_reporting (E_ALL);
echo "<h2>TCP/IP Connection</h2>\n";
/* Get the port for the WWW service. */
$service_port = getservbyname ('www', 'tcp');
/* Get the IP address for the target host. */
$address = gethostbyname ('www.php.net');
/* Create a TCP/IP socket. */
$socket = socket_create (AF_INET, SOCK_STREAM, 0);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror ($socket) . "\n";
} else {
"socket_create() successful: " . socket_strerror ($socket) . "\n";
}
echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect ($socket, $address, $service_port);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}
$in = "HEAD / HTTP/1.0\r\n\r\n";
$out = '';
echo "Sending HTTP HEAD request...";
socket_write ($socket, $in, strlen ($in));
echo "OK.\n";
echo "Reading response:\n\n";
while ($out = socket_read ($socket, 2048)) {
echo $out;
}
echo "Closing socket...";
socket_close ($socket);
echo "OK.\n\n";
?> |
|
- 目次
- socket_accept -- ソケットã¸ã®æŽ¥ç¶šã‚’許å¯ã™ã‚‹
- bind -- ソケットã«åå‰ã‚’ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹
- socket_clear_error -- Clears the error on the socket or the last error code
- socket_close -- ファイル記述åã‚’é–‰ã˜ã‚‹
- socket_connect -- ã‚½ã‚±ãƒƒãƒˆä¸Šã®æŽ¥ç¶šã‚’åˆæœŸåŒ–ã™ã‚‹
- socket_create_listen --
接続をå—ã‘ã¤ã‘ã‚‹ãŸã‚ã«ãƒãƒ¼ãƒˆã«ã‚½ã‚±ãƒƒãƒˆã‚’オープンã™ã‚‹
- socket_create_pair --
区別ã§ããªã„ソケットã®çµ„を作æˆã—ã€fdã«ä¿å˜ã™ã‚‹
- socket_create -- ソケットを作æˆã™ã‚‹(通信時ã®çµ‚端)
- socket_get_option -- Gets socket options for the socket
- socket_getpeername --
fdを指定ã€ã‚½ã‚±ãƒƒãƒˆã®ãƒªãƒ¢ãƒ¼ãƒˆå´ã‚’既述ã™ã‚‹sa.sin_addrãŠã‚ˆã³
sa.sin_portã®å€¤ã‚’addrãŠã‚ˆã³portã®æ–‡å—列ã«ä¿å˜ã™ã‚‹
- socket_getsockname --
fdを指定ã€ã‚½ã‚±ãƒƒãƒˆã®ãƒãƒ¼ã‚«ãƒ«å´ã‚’既述ã™ã‚‹sa.sin_addrãŠã‚ˆã³
sa.sin_portã®å€¤ã‚’addrãŠã‚ˆã³portã®æ–‡å—列ã«ä¿å˜ã™ã‚‹
- socket_iovec_add -- æ–°è¦ãƒ™ã‚¯ãƒˆãƒ«ã‚’åŽé›†ç”¨é…列ã«è¿½åŠ ã™ã‚‹
- socket_iovec_alloc --
sendmsg, recvmsg, writev, readvã§ä½¿ç”¨ã™ã‚‹ã‚ˆã†'struct iovec'を構築ã™ã‚‹
- socket_iovec_delete -- ベクトルã®é…列ã‹ã‚‰ãƒ™ã‚¯ãƒˆãƒ«ã‚’削除ã™ã‚‹
- socket_iovec_fetch --
iovec_id[iovec_position] ã§æŒ‡å®šã—ãŸiovecã«ä¿å˜ã•れãŸãƒ‡ãƒ¼ã‚¿ã‚’è¿”ã™
- socket_iovec_free -- iovec_idã§æŒ‡å®šã—ãŸiovecを解放ã™ã‚‹
- socket_iovec_set --
iovec_id[iovec_position]ã«ä¿æŒã•れãŸãƒ‡ãƒ¼ã‚¿ã«new_valã‚’è¨å®šã™ã‚‹
- socket_last_error -- ソケットã®ç›´è¿‘ã®ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã™/クリアã™ã‚‹
- socket_listen -- ã‚½ã‚±ãƒƒãƒˆä¸Šã§æŽ¥ç¶šå¾…ã¡(listen)ã™ã‚‹
- socket_read -- ソケットã‹ã‚‰èªã¿ã“ã‚€
- socket_readv --
iovec_idã§å®šç¾©ã—ãŸåŽé›†ç”¨é…列を用ã„ã¦fdã‹ã‚‰èªã¿è¾¼ã‚€
- socket_recv -- 接続ã—ãŸã‚½ã‚±ãƒƒãƒˆã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã™ã‚‹
- socket_recvfrom --
接続ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã«ã‚ˆã‚‰ãšã€ã‚½ã‚±ãƒƒãƒˆã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã™ã‚‹
- socket_recvmsg --
接続用ã§ã‚ã‚‹ã‹ã©ã†ã‹ã«ã‹ã‹ã‚らãšã‚½ã‚±ãƒƒãƒˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹
- socket_select --
tv_secã¨tv_usec ã§æŒ‡å®šã—ãŸæœ‰åŠ¹æ™‚é–“ã§select()システムコールを実行
ã™ã‚‹
- socket_send -- 接続ã—ãŸã‚½ã‚±ãƒƒãƒˆã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã™ã‚‹
- socket_sendmsg --
接続用ã§ã‚ã‚‹ã‹ã©ã†ã‹ã«ã‹ã‹ã‚らãšã‚½ã‚±ãƒƒãƒˆã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹
- socket_sendto --
接続ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã«ã‚ˆã‚‰ãšã‚½ã‚±ãƒƒãƒˆã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹
- socket_set_nonblock -- ファイル記述åfdã‚’éžãƒ–ãƒãƒƒã‚¯ãƒ¢ãƒ¼ãƒ‰ã«è¨å®šã™ã‚‹
- socket_set_option -- Sets socket options for the socket
- socket_shutdown --
å—ä¿¡ã€é€ä¿¡ã€ã¾ãŸã¯é€å—信用ã®ã‚½ã‚±ãƒƒãƒˆã‚’シャットダウンã™ã‚‹
- socket_strerror -- ソケットエラーã®å†…容を文å—列ã¨ã—ã¦è¿”ã™
- socket_write -- ã‚½ã‚±ãƒƒãƒˆã«æ›¸ã込む
- socket_writev --
iovec_idã§å®šç¾©ã—ãŸåŽé›†ç”¨é…列を用ã„ã¦ãƒ•ァイル記述åfdã«æ›¸ã込む