关于php socket编程中遇到的一些问题

网上有很多php socket的教程,但是我在自己写的时候还是碰到了几个问题,然后调试了一段时间,有一些目前也不知道原因:

1.第一个问题是,如果你是这么写的:

if($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) === false)
    echo 'socket_create() failed, reason:' . socket_strerror(socket_last_error()) . "\n";

那么你的$sock不会是socket资源而会得到一个false,要改为如下写法:

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($sock === false)
    echo 'socket_create() failed, reason:' . socket_strerror(socket_last_error()) . "\n";

2.客户端的代码如果想得到服务器端write的内容,也是可以的,但是客户端的read要在write之后才可以:

    $rs = socket_write($sock, $words);
    $hear = socket_read($sock, 8192);

3.客户端不能使用socket_accept。

4.现在还有一个问题就是如果客户端退出之后,服务器端还是会一直打印false。

5.下面的代码服务器端只能支持一个客户端的连接,怎么实现服务器端支持多客户端还不清楚。

下面列出服务器端和客户端的代码:

服务器端:

<?php

error_reporting(1);

set_time_limit(0);
ob_implicit_flush();

$address = '127.0.0.1';
$port = 7777;

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($sock === false)
    echo 'socket_create() failed, reason:' . socket_strerror(socket_last_error()) . "\n";

if(socket_bind($sock, $address, $port) === false)
    echo 'socket_bind() failed, reason:' . socket_strerror(socket_last_error()) . "\n";

if(socket_listen($sock) === false)
    echo 'socket_listen() failed, reason:' . socket_strerror(socket_last_error()) . "\n";

$msgsock = socket_accept($sock);

if ($msgsock === false)
    echo 'socket_accept() failed, reason:' . socket_strerror(socket_last_error()) . "\n";

do {

    $buf = socket_read($msgsock, 8192);

    echo $buf;

    $rs = socket_write($msgsock, 'i dont know') ;

    var_dump($rs);

    usleep(1000000);

} while (true);

socket_close($sock);

?>

客户端:

<?php error_reporting(1); set_time_limit(0); $address = '127.0.0.1'; $port = 7777; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if($sock === false) echo 'socket_create() failed, reason:' . socket_strerror(socket_last_error()) . "\n"; $result = socket_connect($sock, $address, $port); if($result === false) echo 'shit'; while ($result) { $words = fgets(STDIN); $rs = socket_write($sock, $words); $hear = socket_read($sock, 8192); var_dump($hear); if(trim($words) == 'bye') break; } socket_close($sock); ?>

另外发现一个对于socket的比较好理解的解释:
socket就是应用层与TCP/IP协议族通信的中间软件抽象层

你可能感兴趣的:(PHP,tcp,socket)