‘壹’ php中关于socket的系列函数总结
本文列举了所有关于PHP语言中使用socket相关服务的一些函数。注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释(分号):
代码如下:
extension=php_sockets.dll
如果你无法去掉注释,那么请使用下面的代码来加载扩展库:
代码如下:
if(!extension_loaded('sockets')){
if(strtoupper(substr(PHP_OS,3))=="WIN"){
dl('php_sockets.dll');
}else{
dl('sockets.so');
}
}
如果你不知道你的socket是否打开,那么你可以使用phpinfo()函数来确定socket是否打开。你通过查看phpinfo信息了解socket是否打开。
php
socket
相关函数如下:
代码如下:
socket_accept()
接受一个Socket连接
socket_bind()
把socket绑定在一个IP地址和端口上
socket_clear_error()
清除socket的错误或者最后的错误代码
socket_close()
关闭一个socket资源
socket_connect()
开始一个socket连接
socket_create_listen()
在指定端口打开一个socket监听
socket_create_pair()
产生一对没有区别的socket到一个数组里
socket_create()
产生一个socket,相当于产生一个socket的数据结构
socket_get_option()
获取socket选项
socket_getpeername()
获取远程类似主机的ip地址
socket_getsockname()
获取本地socket的ip地址
socket_iovec_add()
添加一个新的向量到一个分散/聚合的数组
socket_iovec_alloc()
这个函数创建一个能够发送接收读写的iovec数据结构
socket_iovec_delete()
删除一个已经分配的iovec
socket_iovec_fetch()
返回指定的iovec资源的数据
socket_iovec_free()
释放一个iovec资源
socket_iovec_set()
设置iovec的数据新值
socket_last_error()
获取当前socket的最后错误代码
socket_listen()
监听由指定socket的所有连接
socket_read()
读取指定长度的数据
socket_readv()
读取从分散/聚合数组过来的数据
socket_recv()
从socket里结束数据到缓存
socket_recvfrom()
接受数据从指定的socket,如果没有指定则默认当前socket
socket_recvmsg()
从iovec里接受消息
socket_select()
多路选择
socket_send()
这个函数发送数据到已连接的socket
socket_sendmsg()
发送消息到socket
socket_sendto()
发送消息到指定地址的socket
socket_set_block()
在socket里设置为块模式
socket_set_nonblock()
socket里设置为非块模式
socket_set_option()
设置socket选项
socket_shutdown()
这个函数允许你关闭读、写、或者指定的socket
socket_strerror()
返回指定错误号的详细错误
socket_write()
写数据到socket缓存
socket_writev()
写数据到分散/聚合数组
‘贰’ 关于php中socket的问题:
这是socket的服务端的代码,监听的ip地址是192.168.168.121,端口号为8528
请检查以下几点
这个ip是不是代码所在服务器的ip,一般监测内网ip,如127.0.0.1
端口号是否被使用,可以使用cmd命令 netstat -ano|findstr 8528 查找端口号为8528的端口使用情况
如果要给在公网上使用,请使用公网ip,这样可以外网使用
如果代码不报错可以试下telnet下你的端口号,看是否可以使用
如 telnet 127.0.0.1 8528
解决方案
查看你电脑的ip地址,把上面代码里“$address = '192.168.168.121';”这个ip地址换成“$address = '127.0.0.1';”或者你电脑的ip地址,再试试。
(ip地址改成127.0.0.1后,这段代码在我电脑上可以使用)
‘叁’ php 怎么关闭非正常退出时的socket端口
首先:
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
用图表示:
如果进程结束,关联的端口也会一同取消绑定,如果你重新打开无法绑定端口,说明你原来的进程并没有结束,请检查进程中还有没有原来的脚本。另外,你在脚本中加入关闭脚本时关闭端口的代码不就完全解决这个问题了吗
‘肆’ 关于socket通信运行机制的问题(PHP):
php socket 是以php cli 模式运行的 也就是在服务器上用命令行执行php xxx.php
而你要保持这个文件的长连接 。就是持久监控。
保持长连接也就是死循环
while(true){
这里写socket的一些方法
}
这样他就是会一直执行。设置超时时间为0
这就socket的基本而原理 也是消息队列的基本原理
‘伍’ PHP SOCKET 技术研究
今天试着写一个
PHP
与
C
语言通过socket通讯的程序,看过PHP手册,发现有好几种方式可以建立socket
客户端.
1、通过
fsockopen()
建立socket连接,然后用
用fputs()
发送消息,用
fgets()
接收消息。
2、通过
socket_create()
建立
socket
连接,然后用
socket_send()
or
socket_write()
发送消息,用
socket_recv()
or
socket_read()
发送消息。
很奇怪,我在手册上看到了这样一段话"本扩展模块是实验性的。该模块的行为,包括其函数的名称以及其它任何关于此模块的文档可能会在没有通知的情况下随
PHP
以后的发布而改变。我们提醒您在使用本扩展模块的同时自担风险。"
看来
php4.0
socket通讯还不是完全稳定。
今天我写的客户端要与服务端做两次通讯,我用上面这个方法都写了一个客户端程序,发现当仅仅就一次通讯的时候,也就是PHP客户端发送一次消息,然后接收返回消息,就关闭连接。这两种方法都能正确快速的实现功能,但当做两次通讯时,却有明显的差别,第一种方法第一次通讯特别快就结束了,这个我可以通过服务端的输出看出来,但是第二次通讯要等上好几分钟才能结束,我试了好几次都这样,我不太清楚我的程序哪里出错了,还是这个方式连接就是有问题,但是第二种方法做这两次通讯却很快,正确!完成的非常的。
最后我根据
第二种情况写了一个
class
//////////////////////////////
File
Description
//////////////////////////////////////////
//
Class
Name
:
socket
//
Version
:
V1.0
//
Functional
Outline
:
create
socket,and
send
message
to
server
//
Revision
history
:
2004/12/15
First
version
created
//
Current
:
2004/12/15
Liu
Yongsheng
//////////////////////////////////////////////////////////////////////////////////////////
class
socket{
var
$socket;
//socket
句柄
var
$sendflag
=
">>>";
var
$recvflag
=
"<<<";
var
$response;
var
$debug
=
1;
function
socket($hostname,$port){
$address
=
gethostbyname($hostname);
$this->socket
=
socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$result
=
socket_connect($this->socket,$address,$port);
if($this->debug
==
1){
if
($result
<
0)
{
echo
"socket_connect()
failed.\nReason:
($result)
"
.
socket_strerror($result)
.
"<br>";
}
else{
echo
"connect
OK.<br>";
}
}
}
function
sendmsg($msg){
socket_write($this->socket,$msg,strlen($msg));
$result
=
socket_read($this->socket,100);
$this->response
=
$result;
if($this->debug
==
1){
printf("<font
color=#CCCCCC>%s
$msg</fon><br>",$this->sendflag);
printf("<font
color=blue>%s
$result</font><br>",$this->recvflag);
}
return
$result;
}
function
close(){
socket_close($this->socket);
}
}
‘陆’ php 的 socket如何判断连接已经断开
当连接断开时,读写socket的函数会失败。如socket_read()在读取失败时布尔值false。这时可以调用socket_last_error()和socket_strerror()函数得到错误代码和错误信息。可以根据这个判断失败原因是否为连接断开。
望采纳~~
‘柒’ 客户端发给socket一个请求,服务器端使用php处理完成后,怎样在php里断开这个socket连接
你好,我在知道看到你的另外一个提问
你说你用fopen()打开的socket,应该指的是客户端那边用fopen()建立与服务器的连接的吧
socket的机制是,有一个服务端,然后客户端连接服务端的时候,服务端可以通过accept来获取一个客户端socket对象,PHP手册的socket_close()的说明是这样的
void socket_close ( resource socket )
socket_close() closes the socket resource given by socket. 注: socket_close() can't be used on PHP file
resources created with fopen(), popen(), fsockopen(), or pfsockopen(); it is meant for sockets created with socket_create() or
socket_accept().
See also socket_bind(), socket_listen(), socket_create() and socket_strerror().
大概意思是socket_close(resource socket )中的socket不能是由fopen(), popen(), fsockopen(), or pfsockopen()这些方法产生的,只能是socket_create() or socket_accept()方法,前面那些方法应该是在客户端用的啊,你服务端用的应该是socket_accept(),为什么不能用socket_close来关闭呢
‘捌’ PHP socket 问题
你去把报错的内容也贴出来啊
‘玖’ php socket的问题!
$host="192.168.1.111";
$port=1254;
这可能有问题:(1)你看看你的ip地址是不是192.168.1.111(2)如果是的话,看看端口是不是被占领
‘拾’ 关于php socket问题
使用socket_read函数,在socket_write($socket,$file);这句话以后使用,
如
$buf = socket_read($socket,8192);
echo "Received msg: $buf \n";
注意这里使用的套接字必须与上面socket_write使用的保持一致,如果你认为有延迟的话,那你可以加上一个for 或while语句进行封装