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).
<?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
<?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);//工作完毕,关闭套接流