用php模拟做服务端侦听端口

 

参考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html

 

http://blog.csdn.net/alongken2005/article/details/8056910

 

socket_accept()是服务端接受客户端请求,一旦有一个客户端链接上来的话,则这个函数会返回一个新的socket资源,这个资源是与客户端通信的资源。

 socket_accept()是阻塞的,会一直卡在那里。

 

 

发现情况:一旦客户端断开链接了,会影响到服务端的主进程。如何避免这个影响呢?

 

正常的服务器,应该是新开一个子进程来处理请求。

 

socket_connect()是链接一个socket去。是客户端使用的。

 

c语言的介绍:connect, send, recv都是同步阻塞工作模式。

 那么,可以得出结论,socket_connect()也是阻塞性的。

 

php中使用协程:

http://www.laruence.com/2015/05/28/3038.html

 

socket_recv和socket_read($msgsock, 2048, PHP_NORMAL_READ)

有什么区别呢?

 

stream_select()

接受一个socket流,可以多个,一个数组形式。

等待这些流改变了状态。改变了状态,则会返回大于0的一个值

<?php
/* Prepare the read array */
$read   = array($stream1, $stream2);//创建的两个socket
$write  = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
    /* Error handling */
} elseif ($num_changed_streams > 0) {
    /* At least on one of the streams something interesting happened */
}
?>

要使用引用传递,值会被修改。

 

php多路复用参考资料:http://blog.csdn.net/phphot/article/details/2020269

 

总结

如果没有安装socket扩展,则使用如下相关函数:stream_socket_client、fread()、fwrite()、stream_select()、fclose()

如果安装了sokcet扩展,则可以替换掉扩展的函数:

stream_socket_client等价于socket_create()

socket_select()等价于stream_select()

socket_close()等价于fclose()

socket_write()等价于fwrite()

socket_read()等价于fread()

 

stream_socket_client()实际上是在调用linux系统的 connect()函数。

socket_select()、stream_select()都是在调用操作系统提供的select()函数。

 

 思考:stream和socket本质有什么区别呢?

 不知道,想着去去思考socket_accept和socket_listen()区别,也许就能找到答案了。

 

我总把socket_accept和socket_listen()进行混淆了。

 

socket_accept是开始接受客户端的链接,如果有客户端链接上来,这个函数会返回一个socket通道的句柄,这个句柄是专门与客户端单独的句柄。socket_listen是开始侦听这个socket通道,只是侦听,并不是接受客户端的连接请求。

 

时间: 2024-09-26 05:01:43

用php模拟做服务端侦听端口的相关文章

SuperSocket 做服务端,html5 客户端,连接不了,有人用过吗??

问题描述 要做个简单的实时通讯对话,网上找到了SuperSocket快速做服务端应用,下面自己写的简单服务端classProgram{staticList<AppSession>_sessions=newList<AppSession>();staticvoidMain(string[]args){Console.WriteLine("Pressanykeytostarttheserver!");Console.ReadKey();Console.WriteLi

C#做服务端,怎么增加新特性?在其他机器编译生成exe文件和dll文件,再拷贝到服务器上?

问题描述 1.之前用PHP搞服务端,增加新特性,是容易的自己再机器上调试好代码,直接提交到服务器上,特性就更新成功了.因为PHP,不需要编译,直接提交新的代码就行.2.C#做服务端,怎么增加特性呢?一直好奇这些,强语言,怎么操作.调试好代码,生成exe文件和依赖的DLL之类的,拷贝的服务器上?是这样吗?2.1如果这样的话,即使增加一个很小的特性,比如几十行代码,都得把整个项目的代码都重新编译一遍? 解决方案 解决方案二:编译型的语言要添加新的功能就得重新编译,生成的dll,然后发布.但是你也可以

tcp连接-TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗?

问题描述 TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗? 比如用来监听连接的socket绑定23端口,服务端每接受一个连接都新开一个线程和客户端通信,并把新socket传递给新线程,是不是所有新创建的socket都是经过23端口和客户端通信? 解决方案 是的,都通过端口23进行通信 解决方案二: 都是监听端口,如果不是客户端就不能将数据发送到服务器 解决方案三: 23只是监听建立连接,后续数据交换走实际上端口

使用阿里云来做服务端,udp传输协议,如何获取真实ip地址?

问题描述 使用阿里云来做服务端,udp传输协议,如何获取真实ip地址? 使用阿里云来做服务端,udp传输协议,如何获取真实ip地址? 解决方案 谁获得谁的真实ip.你怎么定义"真实ip"? 首先,你的服务器天然可以获得客户端公网的ip,你的客户端天然可以获得服务器的ip 至于你要获得客户端的私有ip,你可以在客户端获得了,作为你udp数据包的一部分发给服务端.

debug-webstorm+nodejs 调试 侦听端口 没有执行程序?

问题描述 webstorm+nodejs 调试 侦听端口 没有执行程序? 装了webstorm 和nodejs 在webstorm里面可以正常run 没有任何问题 但是不能debug 只有一句Debugger listening on port 5942 没有执行任何一条语句 更不用说是执行到断点了... 不懂为什么 解决方案 服务器没正确配置吧. 我用PHPStorm时也遇到过这种问题

java netty做服务端在线用户对战匹配,手机客户端p2p方式通信

问题描述 服务端匹配在线用户怎么做,求大神给思路. 解决方案

socket 服务端监听 过几天后看不到端口了

问题描述 socket做的文件上传程序,当执行Application_Start的时候开始监听,用netstat-an可以看到端口处于监听状态,上传文件正常,可是几天之后,在用netstat-an看不到端口,上传文件肯定也上传不上去了.无错误日志.程序如下:privateSocketm_listener;publicPolicyServer(){m_listener=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolTy

Linux用netstat查看服务及监听端口

[root@localhost ~]# netstat -nlp netstat命令各个参数说明如下: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序) -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序. -n : 不进行DNS轮询(可以加速操作) 即可显示当前服务器上所有端口及进程服务,于grep结合可查看某个具体端口及服务情况 [root@localho

我在C#里面使用UdpClient这个类侦听端口:11000时,如何得到向我发信息人的IP与端口呢

问题描述 我的机器是处在公网,用UdpClient类的Receive()方法来接收信息,但这个方法只能得到信息内容,不能得到信息从哪个IP.端口而来.两台机器都在公网还好做,就把自已的IP打包成数据发送过去就行了.如果有一台机器在内网,内网的机器使用Dns.GetHostEntry(Dns.GetHostName())也只能得到内网IP,打包内网IP发过去也没用了.只要接收方能够得到发信息方的IP和端口就好办了.很急,知道的朋友帮帮忙啊. 解决方案 解决方案二:Receive需要一下IPEndP