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

来源:互联网 发布:淘宝网品牌 编辑:程序博客网 时间:2024/05/22 03:30

网上有很多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.下面的代码服务器端只能支持一个客户端的连接,怎么实现服务器端支持多客户端还不清楚。

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

服务器端:

<?phperror_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);?>

客户端:

<?phperror_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协议族通信的中间软件抽象层

0 0
原创粉丝点击