socket的bind函数是不是只能绑定本地IP,不能绑定外网IP么?
参考: https://bbs.csdn.net/topics/391024376
别瞎猜测。
所谓bind,就是指绑定本地接受端口。
指定ip,是为了分辨多ip主机。
------------------------------------------------------
这个应该是不可以的,你的电脑只能控制你自己的电脑的IP,不能控制别人电脑的IP,试想一下,如果你可以控制别人的电脑的IP,那网络不就乱套了,除非别人给你开了端口映射,你可以百度下端口映射技术。
下面的172.18.68.44 不能填外网的ip 地址。 那172.18.68.44是怎么看出来的呢?
由上图可以看出, 这个172.18.68.44 上网卡上的ip。,当然,socket_bind($socket, '0.0.0.0', 8888); 绑定0.0.0.0 也是可以的。
In the context of servers, 0.0.0.0 means all IPv4 addresses on the local machine. If a host has two IP addresses, 192.168.1.1 and 10.1.2.1, and a server running on the host listens on 0.0.0.0, it will be reachable at both of those IPs (Note: This particular text is repeated from above as part of the overall answer).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php //创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /*绑定接收的套接流主机和端口,与客户端相对应*/ if (socket_bind( $socket , '172.18.68.44' ,8888) == false){ echo 'server bind fail:' .socket_strerror(socket_last_error()); /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/ } //监听套接流 if (socket_listen( $socket ,4)==false){ echo 'server listen fail:' .socket_strerror(socket_last_error()); } //让服务器无限获取客户端传过来的信息 do { /*接收客户端传过来的信息*/ $accept_resource = socket_accept( $socket ); /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/ if ( $accept_resource !== false){ /*读取客户端传过来的资源,并转化为字符串*/ $string = socket_read( $accept_resource ,1024); /*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/ echo '----------server receive is :' . $string .PHP_EOL; //PHP_EOL为php的换行预定义常量 if ( $string != false){ $return_client = '+++++++++++++server receive is : ' . $string .PHP_EOL; /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/ socket_write( $accept_resource , $return_client , strlen ( $return_client )); /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/ } else { echo 'socket_read is fail' ; } /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/ socket_close( $accept_resource ); } } while (true); socket_close( $socket ); |
client_socket.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?php //创建一个socket套接流 $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /****************设置socket连接选项,这两个步骤你可以省略*************/ //接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它 socket_set_option( $socket , SOL_SOCKET, SO_RCVTIMEO, array ( "sec" => 1, "usec" => 0)); //发送套接流的最大超时时间为6秒 socket_set_option( $socket , SOL_SOCKET, SO_SNDTIMEO, array ( "sec" => 6, "usec" => 0)); /****************设置socket连接选项,这两个步骤你可以省略*************/ //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系 if (socket_connect( $socket , '120.79.14.84' ,8888) == false){ echo 'connect fail massege:' .socket_strerror(socket_last_error()); } else { $message = 'l love you 我的 socket' ; //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同 // $message = mb_convert_encoding($message,'GBK','UTF-8'); //向服务端写入字符串信息 if (socket_write( $socket , $message , strlen ( $message )) == false){ echo 'fail to write' .socket_strerror(socket_last_error()); } else { echo 'client write success' .PHP_EOL; //读取服务端返回来的套接流信息 while ( $callback = socket_read( $socket ,1024)){ echo 'server return message is:' .PHP_EOL. $callback ; } } } socket_close( $socket ); //工作完毕,关闭套接流 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-03-14 【转】Wireshark技巧-过滤规则和显示规则
2017-03-14 [转]Wireshark抓包工具--TCP数据包seq ack等解读
2017-03-14 网络学习资源