最近做的一个项目,需要用到php socket通信方面,现在我测试了 ,在TCP下可以成功从客户端发往服务端,服务端也可以返回到客户端信息。
但是在UDP下,程序就会出现问题,可以在客户端接收到信息,但是用socket_write()返回的话,会显示找不到返回的地址然后 客户端也接受不到服务端返回的信息!  
  在此 请求  懂这方面的帮忙解决下。PHP Warning:  socket_write(): unable to write to socket [0]: 由于套接字没有连接
并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求
没有被接受。 socket PHPUDPsocket_write()

解决方案 »

  1.   


    这里是服务端
    <?php
    set_time_limit( 0 );
    ob_implicit_flush();
    echo "创建SOCKT...\n";
    $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP);
    if ( $socket === false ) {
        echo "socket_create() failed:reason:" . socket_strerror( socket_last_error($socket) ) . "\n";
    }
    echo "绑定SOCKT...\n";
    $ok = socket_bind( $socket, '192.168.1.59', 8686);
    if ( $ok === false ) {
        echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );
    }
    else
    {
    echo "绑定SOCKT成功...\n";
    }
    $count = 0;
    socket_set_block ($socket);
    do {  
    $msg ="服务端发往客户端!!!\n";
    socket_sendto($socket,$msg,strlen($msg),0,'192.168.1.59',1207);
    echo "测试成功了\n";
    $form="";
    // $port=0;
     socket_recvfrom($socket,$buf,1024,0,$form,$port);
    echo "测试成功了啊\n";
        $talkback = "收到的信息:$buf\n";
    echo $buf1;
    echo $talkback;
     
       
    } while (true);
    socket_close($socket);?>
    这里是客户端<?php
    $server_ip="192.168.1.59";
    $port = 8686;echo "创建SOCKT...\n";$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die ("sockt create failed"); 
    socket_bind( $socket, '192.168.1.59', 1207);
    if(!socket_connect($socket, '192.168.1.59', $port)){
             print("Couldn't connect: " .socket_strerror(socket_last_error()) . "\n");
         }
    socket_sendto($socket, $str, $arrayLen, 0, '192.168.1.59',8686);
    echo "发送到服务器信息成功!\n";
    echo "发送的内容为:<font color='red'>$str</font> <br>";
    $form ="";
    $port1=0;
    socket_recvfrom($socket,$buf,1024,0,$form,$port1);
    echo $form;
    echo $port1;
    echo "回传信息成功!".$buf;echo "<br/>";
    echo "关闭SOCKET...\n";
    socket_close($socket);
    echo "关闭OK\n";
    ?>
    帮忙看下吧
      

  2.   

    // $port=0;  这里的注释也要去掉。。 一直做各种测试呢 。  没弄好
      帮忙看下吧。   
       就是服务端可以接受到,客户端接收不到服务端回传的信息,或者是回传不过来。   
      
      

  3.   

    服务器端为何没有listen和accept?
      

  4.   

    因为是UDP的  不是TCP的啊  
      

  5.   

    connect  是在客户端加的啊  
    而且我用的是socket_recvfrom 与socket_sendto 后面加地址的。  所以 这里可以不用加connect的,在客户端的connect 是我测试socket_write与socket_read的时候用的
      

  6.   

    客户端应该是连接哪里就从哪里recv的,没理由要分开端口
    客户端也没必要bind吧?
      

  7.   

    嗯 没必要绑定。。    我这不是没有办法了么,  然后各种测试么。   客户端BIND以前是没绑定的,在这里没有效果的。我删除了BIND  ,也一样出现这样的效果!
      

  8.   

    别使用udp了。tcp是标准的被推荐的方式。udp在很多软件中都不被支持。
      

  9.   

    这里有个足够简单的UDP例子了http://www.zrwm.com/?p=1281
      

  10.   

    我也不想用UDP了  ,TCP的测试成功了,但是项目要求必须要用UDP的 !  
      

  11.   

      非常感谢snmr_com  从你发给我的链接上 的代码 ,修改了下,成功了!