本帖最后由 xiongmzh 于 2011-01-28 15:02:38 编辑

解决方案 »

  1.   

    $name        = iconv("UTF-8", "GBK", $name);
        $name_len    = strlen($name);
        $nlen = $name_len + 2;
        $format = sprintf("vvvva%d", $name_len); //格式化字符串                         第43行
    建议检查一下是不是多字节导致计算字节长度数值错误,如果包含中文的话,建议使用mb_strlen来计算,怕样就不用再使用转换iconv("UTF-8", "GBK", $name);,楼主可以修改试一下,另外可以查看一下出错日志,再进一步进行定位:
    mb_strlen
    (PHP 4 >= 4.0.6, PHP 5)mb_strlen — Get string length说明
    int mb_strlen ( string $str [, string $encoding ] )
    Gets the length of a string. 参数str 
    The string being checked for length. encoding 
    encoding 参数为字符编码。如果省略,则使用内部字符编码。
    返回值
    Returns the number of characters in string str having character encoding encoding. A multi-byte character is counted as 1. 
      

  2.   

    谢谢skyaspnet顶帖
    其实我说的长度或者格式错误,是我为了测试而专门写错的,目的是看看长度或格式有错误的时候,能不能返回什么值或者卡死,没想到真的会卡死(超时),所以我想处理这样的突发情况,万一真的在项目中出现长度或格式错误,卡死很麻烦的:任何页面都无法进入,而且不能重启Apache,要等几分钟后(时间其实不定,看网络状况)才能自己恢复,如果手动重启Apache,会破坏socket#%^&%^... 一旦被破坏,只能重启C++服务器,否则之后的任何php与socket的通信都无法实施;而C++服务器又不是随便重启的,因为随时都有上千人在线....郁闷啊
      

  3.   

      if($buffer = socket_read ( $socket, 1028 ))   
    这一行,为了测试起见
    改成
     if($buffer = socket_read ( $socket, 0))   
    然后发送错误格式的请求串,会不会堵塞住?如果不会,说明你参数格式错的时候,socket server不会任何返回数据。