Urgent: PHP program blocked at socket_create() function!

Discussion in 'PHP' started by moonriver, Nov 14, 2008.

  1. #1
    When I was running a PHP program, the whole application was somehow blocked at the socket_create() function, not return at all! This application could work at another host. Checking the TCP/IP configuration, I found everything was OK. A small C program acting as TCP Server (which needs to create socket as well) can also function well. Are there any experts who can help me?

    The PHP program source codes are shown below, with the blocked line highlighted in bold:

    ===============================================================

    Line number On/Off | Expand/Contract
    <?php
    //-----------------------------------------User Defined Functions-------------------------------------------------------------------
    function SwapNibbleForUnitNo($UnitNum)
    {
    $Swapped_H_UnitNum = "";
    $H_UnitNum = dechex($UnitNum);
    while (strlen($H_UnitNum)>1)
    {
    $NibbleVal = substr($H_UnitNum,-2);
    $Swapped_H_UnitNum = $Swapped_H_UnitNum . $NibbleVal;
    $H_UnitNum = substr($H_UnitNum,0,-2);
    }
    if (strlen($H_UnitNum)==1)
    $Swapped_H_UnitNum = $Swapped_H_UnitNum."0".$H_UnitNum;
    $Swapped_H_UnitNum = str_pad($Swapped_H_UnitNum, 8, "0", STR_PAD_RIGHT);
    return $Swapped_H_UnitNum;
    }

    function getCheckSum($str)
    {
    $chkSum=0;
    while (strlen($str)>0)
    {
    $OneByteVal = substr($str,0,2);
    $chkSum = $chkSum + hexdec($OneByteVal);
    $str = substr($str,2);

    }
    //echo "<br>chkval:".$chkSum % 256;

    $ff = dechex($chkSum % 256);
    //echo "<br>hexvalchk:".$ff;
    return $ff;
    }

    function convertHex(&$str)
    {
    $temp = dechex(round($str * (3.14285714285714 * 100000000 / 180)));

    if (!((strlen($temp))%2) == 0)
    $temp = "0".$temp;
    $str = "";
    for ($i=strlen($temp);$i>=0;$i=$i-2)
    $str = $str.substr($temp,$i, 2);
    //echo "<BR>STR :".$str;
    }

    function convertIdToBytes($id,&$idc1,&$idc2,&$idc3,&$idc4)
    {
    switch (strlen($id)) {
    Case 8:
    $idc1 = substr($id, 6, 2);
    $idc2 = substr($id, 4, 2);
    $idc3 = substr($id, 2, 2);
    $idc4 = substr($id, 0, 2);
    break;
    Case 7:
    $idc1 = substr($id, 5, 2);
    $idc2 = substr($id, 3, 2);
    $idc3 = substr($id, 1, 2);
    $idc4 = "0".substr($id, 0, 1);
    break;
    Case 6:
    $idc1 = substr($id, 4, 2);
    $idc2 = substr($id, 2, 2);
    $idc3 = substr($id, 0, 2);
    $idc4 = "00";
    break;
    Case 5:
    $idc1 = substr($id, 3, 2);
    $idc2 = substr($id, 1, 2);
    $idc3 = "0".substr($id, 0, 1);
    $idc4 = "00";
    break;
    Case 4:
    $idc1 = substr($id, 2, 2);
    $idc2 = substr($id, 0, 2);
    $idc3 = "00";
    $idc4 = "00";
    break;
    Case 3:
    $idc1 = substr($id, 1, 2);
    $idc2 = "0".substr($id, 0, 1);
    $idc3 = "00";
    $idc4 = "00";
    break;
    Case 2:
    $idc1 = substr($id, 0, 2);
    $idc2 = "00";
    $idc3 = "00";
    $idc4 = "00";
    break;
    Case 1:
    $idc1 = "0".substr($id, 0, 1);
    $idc2 = "00";
    $idc3 = "00";
    $idc4 = "00";
    break;
    }
    }


    function addIntoLogTable($UnitNo,$Command,$logDesc,$username)
    {
    echo "<br>inside addIntoLogTable function";
    $filename = "../database/DataBaseType.txt";
    $fp = fopen($filename,"r");
    $contents = fread ($fp, filesize ($filename));
    fclose($fp);
    sscanf($contents,"%s %s %s %s %s",$dbtype,$serverName,$un,$pwd,$cat);
    //echo $dbtype;
    $con = mssql_connect($serverName,$un,$pwd);
    mssql_select_db($cat,$con);
    $vano = "";
    $logDateTime = date("Y-m-d h:i:s a");
    if ($con <> 0)
    {
    $rs = mssql_query("select VANo from vehicle_unit_history where unit_no = '$UnitNo' and END_DATE is null");
    if ($rs)
    {
    do {
    while ($row = mssql_fetch_row($rs)) {
    $vano = $row[0];
    }
    } while (mssql_next_result($rs));
    mssql_free_result($rs);
    }
    if ($vano != "")
    {
    echo "<br>Inside query";
    $rs = mssql_query("insert into LOG_STATUS(USER_ID,LOG_DATETIME,LOG_TYPE,VANO,LOG_DESCRIPTION) values('$username','$logDateTime','$Command','$vano','$logDesc')");
    if ($rs)
    echo "<BR>inserted into LOG_STATUS";
    }
    else
    $rs = mssql_query("insert into LOG_STATUS(USER_ID,LOG_DATETIME,LOG_TYPE,LOG_DESCRIPTION) values('$username','$logDateTime','$Command','$logDesc')");
    mssql_close();
    }
    }

    //--------------------M A I N P R G---------------------------------------------------------------------------------------------------------------

    // receive form data
    $SIMNo = $_GET["SIMNo"];
    $USERNAME = $_GET["UID"];
    $UnitNo = $_GET["UnitNo"];
    $CmdCode = $_GET["CmdCode"];
    $CmdData = $_GET["CmdData"];
    $CmdID = $_GET["CmdID"];
    $CmdName = $_GET["CmdName"];
    $PrgMode = $_GET["Prg"];
    $EncodedUnitNo = SwapNibbleForUnitNo($UnitNo);
    $generic_prog="00";
    $secCmdData="0000";
    $Msg = "";
    $Msg1 = "";
    echo "<BR>SIM NO ".$SIMNo;
    echo "<BR>UnitNo ".$UnitNo;
    echo "<BR>CmdCode ".$CmdCode;
    echo "<BR>CmdData ".$CmdData;
    echo "<BR>CmdID ".$CmdID;
    echo "<BR>CmdName ".$CmdName;
    echo "<BR>PRG MODE ".$PrgMode;

    if ($CmdName == "KeyFobCode")
    {
    $fpd = fopen("DEBUG2.log","a");
    fwrite($fpd,"Key Fob Module\n");
    fwrite($fpd, $SIMNo);
    fwrite($fpd, $UnitNo);
    fclose($fpd);
    }

    if ($PrgMode == "1")
    {
    $generic_prog="01";
    if ($CmdName == "ColdStartLatitude")
    {
    convertHex($CmdData);
    $Msg = "01000F000000000000000000000000".substr($CmdData,0,2).substr($CmdData,2,2).substr($CmdData,4,2).substr($CmdData,6,2);
    //echo "<BR>MSF inside".$Msg;
    //exit(0);
    }

    if ($CmdName== "ColdStartLangitude")
    {
    convertHex($CmdData);
    $Msg = "01000F0000000000000000".substr($CmdData,0,2).substr($CmdData,2,2).substr($CmdData,4,2).substr($CmdData,6,2)."00000000";
    //echo "<BR>MSF inside".$Msg;
    //exit(0);
    }
    if ($CmdName == "TransmissionInterval")
    {
    $CmdData = $CmdData/5;
    echo "<BR>Comamnd Data after divideed by 5=".$CmdData;
    $CmdData=dechex($CmdData);
    if (strlen($CmdData)==1)
    $CmdData="0".$CmdData;
    $Msg = "020002000000000000000000".$CmdData."000000000000";
    echo "<br>Inside TransmissionInterval";
    echo "<BR>MSG :".$Msg;
    //exit();
    }
    if ($CmdName == "TransmissionDelayTime")
    {
    $CmdData=dechex($CmdData);
    if (strlen($CmdData)==1)
    $CmdData="0".$CmdData;

    $Msg = "02000400000000000000000000".$CmdData."0000000000";
    echo "<br>Inside TransmissionDelayTime";
    echo "<BR>MSG :".$Msg;
    //exit();

    }
    //AlwaysArmed
    if ($CmdName == "AlwaysArmed")
    {
    //$CmdData=dechex($CmdData);
    if (strlen($CmdData)==1)
    $CmdData="0".$CmdData;
    $Msg = "02800000000000000000".$CmdData."0000000000000000";
    echo "<br>Inside AlwaysArmed";
    echo "<BR>MSG :".$Msg;
    }

    if ($CmdName == "PulsesperDistance") //yet to check
    {
    $CmdData=dechex($CmdData);
    $FirstData = "";
    $SecondData = "";
    $ThirdData = "";
    $FourthData = "";
    echo "<br>Hex VAlue of PUlse:".$CmdData;
    convertIdToBytes($CmdData,$FirstData,$SecondData,$ThirdData,$FourthData);
    echo "First:".$FirstData."Second:".$SecondData;
    $Msg = "040300".$FirstData.$SecondData."0000000000000000000000000000";
    }

    if ($CmdName == "ServiceCenterAddress")
    {
    $Msg = "0400F80000000000000000000000";
    $Msg1 = "050F00";
    $actAdd = "";
    $actAdd1 = "";
    $currentPos = 30;
    $currentPos1 = 17;

    for($i=0;$i<strlen($CmdData);$i++)
    {
    if ((ord(substr($CmdData,$i,1)) >= 48) && (ord(substr($CmdData,$i,1)) <= 57))
    $actAdd = $actAdd.substr($CmdData,$i,1);
    }

    for($i=6;$i<strlen($actAdd)-1;$i = $i + 2) //Second PArt.
    {
    if ((strlen($actAdd)) == $i)
    $Msg1 = $Msg1."F".substr($actAdd,$i,1);
    else
    $Msg1 = $Msg1.substr($actAdd,$i+1,1).substr($actAdd,$i,1);
    $currentPos1++;
    }

    if ($currentPos1-1 < 20)
    for ($i=$currentPos1;$i<21;$i++)
    $Msg1 = $Msg1."FF";
    $Msg1 = $Msg1."000000000000000000000000";

    //$Msg = $Msg.((strlen($actAdd))/2 + 1); //store the length of the actual adress length
    if(strlen(dechex((strlen($actAdd))/2 + 1))==1)
    $Msg = $Msg."0".dechex(((strlen($actAdd))/2 + 1));
    else
    $Msg = $Msg.dechex(((strlen($actAdd))/2 + 1)); //store the length of the actual adress length

    if (substr($CmdData,0,1) == "+")
    $Msg = $Msg."91"; //Local Form/International Form
    else
    $Msg = $Msg."81";

    for($i=0;$i<6;$i = $i + 2)
    $Msg = $Msg.substr($actAdd,$i+1,1).substr($actAdd,$i,1);
    }

    if ($CmdName == "DestinationAddress")
    {
    $Msg = "05F01F00000000";
    $actAdd = "";
    $currentPos = 23;
    for($i=0;$i<strlen($CmdData);$i++)
    {
    if ((ord(substr($CmdData,$i,1)) >= 48) && (ord(substr($CmdData,$i,1)) <= 57))
    $actAdd = $actAdd.substr($CmdData,$i,1);
    }

    //echo "<br>Actual Addr:".$actAdd;
    //echo "<BR>Actual Addr Length ".strlen($actAdd);

    if(strlen(dechex(strlen($actAdd)))==1)
    $Msg = $Msg."0".dechex(strlen($actAdd));
    else
    $Msg = $Msg.dechex(strlen($actAdd)); //store the length of the actual adress length

    if (substr($CmdData,0,1) == "+")
    $Msg = $Msg."91"; //Local Form/International Form
    else
    $Msg = $Msg."81";

    for($i=0;$i<strlen($actAdd);$i=$i+2){
    if ((strlen($actAdd)-1) == $i)
    $Msg = $Msg."F".substr($actAdd,$i,1);
    else
    $Msg = $Msg.substr($actAdd,$i+1,1).substr($actAdd,$i,1);
    $currentPos++;
    }
    //if values thats Zeros r missing, please check here
    echo "<br>CurrentPos ".$currentPos;
    if ($currentPos-1 < 29)
    for ($i=$currentPos;$i<30;$i++)
    $Msg = $Msg."FF";
    $Msg = $Msg."000000";
    }

    if ($CmdName == "OdometerReading")
    {
    $CmdData=dechex($CmdData);
    $FirstData = "";
    $SecondData = "";
    $ThirdData = "";
    $FourthData = "";
    echo "<br>Hex VAlue of Odometer:".$CmdData;
    convertIdToBytes($CmdData,$FirstData,$SecondData,$ThirdData,$FourthData);
    //echo "<BR>First:".$FirstData." Second:".$SecondData." Third:".$ThirdData;
    $Msg = "041C000000".$FirstData.$SecondData.$ThirdData."0000000000000000000000";
    }

    if ($CmdName == "OdometerTransmissionDistance")
    {
    $CmdData=decHex($CmdData);
    $FirstData = "";
    $SecondData = "";
    $ThirdData = "";
    $FourthData = "";
    convertIdToBytes($CmdData,$FirstData,$SecondData,$ThirdData,$FourthData);
    $Msg = "0460000000000000".$FirstData.$SecondData."000000000000000000";
    }
    if ($CmdName == "MainPowerNormalThreshold")
    {
    $Msg = "05002000000000000000000000000000".$CmdData."0000";
    }
    if ($CmdName == "MainPowerLowThreshold")
    {
    $Msg = "0500400000000000000000000000000000".$CmdData."00";
    }
    if ($CmdName == "KeyFobCode")
    {
    //4D434753014A070000AABBCCDD08FFFFFAAFFAAF10CA3CA86A49270126CFDB2F80
    //AAFFAAF10CA3CA86A49270126CFDB2F80
    $keywords = preg_split ("/[\s,]+/", $CmdData);
    $Msg = "08FFFF";
    // echo count($keywords);
    for ($i=0;$i<count($keywords);$i++)
    {
    if(strlen($keywords[$i])==1)
    $Msg.="0".$keywords[$i];
    else
    $Msg.=$keywords[$i];

    }
    echo "<br>Inside KeyFobe";
    echo "<BR>MSG :".$Msg;
    //exit();
    }
    $chkSumMsg = $generic_prog.$EncodedUnitNo."AABBCCDD".$Msg;
    }
    else
    {
    $chkSumMsg = $generic_prog.$EncodedUnitNo."AABBCCDD".$CmdCode.$CmdCode.$CmdData.$CmdData.$secCmdData."000000".$CmdID;
    }
    echo "<BR>CheckSum :".$chkSumMsg;

    if (strlen(getCheckSum($chkSumMsg)) == 1)
    $BinMsg = "4D434753".$chkSumMsg."0".getCheckSum($chkSumMsg);
    else
    $BinMsg = "4D434753".$chkSumMsg.getCheckSum($chkSumMsg);

    $LenBinMsg = strlen($BinMsg)/2;

    /*
    This condition is used to chk whether modem version or smsc version
    done by Selvam on 25-jan-2003
    */

    include "../database/constant.php";

    $filename = "../database/ServerType.txt";
    $fp = fopen($filename,"r");
    $contents = fread ($fp, filesize ($filename));
    fclose($fp);
    sscanf($contents,"%s",$ServerType);

    if (strtoupper($ServerType)=="MODEM")
    {
    $MSGdata = "TYPE=B|MSISDN=+65".$SIMNo."|Message="."\"".$BinMsg."\"|";


    // Create a TCP/IP socket.
    $socket = socket_create(AF_INET,SOCK_STREAM,0);
    if ($socket < 0)
    {
    echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
    exit(-1);
    }


    include "../database/constant.php";

    $result = socket_connect($socket,$ModemServerIp,$ModemServerPort);

    if ($result < 0)
    {
    socket_close($socket);
    echo "socket_connect() failed.\nReason: ($result) ".socket_strerror($result) . "\n";
    exit(-1);
    }
    socket_write($socket,$MSGdata,strlen($MSGdata));
    echo "<br>socket_Write to";

    //this is for SMSC address process, because we need to send 2 SMS to Unit
    if ($Msg1 != "")
    {
    //this is for second SMS (SMSC)
    $chkSumMsg1 = $generic_prog.$EncodedUnitNo."AABBCCDD".$Msg1;
    if (strlen(getCheckSum($chkSumMsg1)) == 1)
    $BinMsg1 = "4D434753".$chkSumMsg1."0".getCheckSum($chkSumMsg1);
    else
    $BinMsg1 = "4D434753".$chkSumMsg1.getCheckSum($chkSumMsg1);
    $MSGdata = "TYPE=B|MSISDN=".$SIMNo."|Message="."\"".$BinMsg1."\"|";
    socket_write($socket,$MSGdata,strlen($MSGdata));
    }
    //Close connection
    socket_close($socket);

    echo "socket close";
    addIntoLogTable($UnitNo,"Modem-Command",$CmdName,$USERNAME);

    }
    else
    {
    $MSGdata = "Subject=Testing\r\n[MSISDN]\r\nList=".$SIMNo."\r\n[MESSAGE]\r\nBinary=".$BinMsg."\r\nLength=".$LenBinMsg."\r\n[SETUP]\r\nClass=3 DCS=8b MobileNotification=NO AckType=Message AckReplyAddress=http://128.185.120.230/cr/netxcell/ack.php ValidityPeriod=10m DestinationPort=3434 OriginatorPort=2323"; //Create Message Body


    $CNXlogin = "Mobileway";
    $CNXpassword = "MW";
    $CNXserverip = "128.185.120.237";
    $CNXaccess ="/examples/servlet/Service1";
    $address = "128.185.120.237";
    $service_port = "80";

    if (!(strlen($MSGdata)>0))
    {
    echo "Error - No data receive\n";
    exit(-1);
    }


    // Create a TCP/IP socket.
    $socket = socket_create(AF_INET,SOCK_STREAM,0);

    if ($socket < 0)
    {
    echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
    exit(-1);
    }
    echo "<BR>Service Port : ".$service_port;
    $result = socket_connect($socket,$address,$service_port);
    if ($result < 0)
    {
    socket_close($socket);
    echo "socket_connect() failed.\nReason: ($result) ".socket_strerror($result) . "\n";
    exit(-1);
    }

    // Make HTTP Request Header

    $in = "POST ".$CNXaccess." HTTP/1.1\r\n";
    $in .= "#HOST: ".$CNXserverip."\r\n";
    $in .= "#Authorization: Basic ".base64_encode($CNXlogin.":".$CNXpassword)."\r\n";
    $in .= "#content-length: ".strlen($MSGdata)."\r\n";
    $in .= "#Version=23\r\n";
    $in .= $MSGdata;
    echo "MSGDATA:".$in;

    //this is for second SMS (SMSC)
    $in1 = "POST ".$CNXaccess." HTTP/1.1\r\n";
    $in1 .= "HOST: ".$CNXserverip."\r\n";
    $in1 .= "Authorization: Basic ".base64_encode($CNXlogin.":".$CNXpassword)."\r\n";
    $chkSumMsg1 = $generic_prog.$EncodedUnitNo."AABBCCDD".$Msg1;
    if (strlen(getCheckSum($chkSumMsg1)) == 1)
    $BinMsg1 = "4D434753".$chkSumMsg1."0".getCheckSum($chkSumMsg1);
    else
    $BinMsg1 = "4D434753".$chkSumMsg1.getCheckSum($chkSumMsg1);
    $LenBinMsg1 = strlen($BinMsg1)/2;
    $MSGdata1 = "Subject=Testing\r\n[MSISDN]\r\nList=".$SIMNo."\r\n[MESSAGE]\r\nBinary=".$BinMsg1."\r\nLength=".$LenBinMsg1."\r\n[SETUP]\r\nClass=3 DCS=8b MobileNotification=NO AckType=Message AckReplyAddress=http://128.185.120.230/cr/netxcell/ack.php ValidityPeriod=10m DestinationPort=3434 OriginatorPort=2323";
    $in1 .= "content-length: ".strlen($MSGdata1)."\r\n\r\n";
    $in1 .= "#Version=23\r\n";
    $in1 .= $MSGdata1;

    $out = "";

    // Send Http Request
    socket_write($socket,$in,strlen($in));

    //this is for SMSC address process, because we need to send 2 SMS to Unit
    if ($Msg1 != "")
    {
    echo "<BR>MSG Data1 ".$MSGdata1;
    //sleep(2);
    if ($socket < 0) {
    echo "<br>Socket Closed";
    socket_connect($socket,$address,$service_port);
    }
    else
    echo "<br>Socket Opened";
    socket_write($socket,$in1,strlen($in1));
    }

    addIntoLogTable($UnitNo,"Command",$CmdName,$USERNAME);
    //Close connection
    socket_close($socket);
    }
    exit();
    ?>
     
    moonriver, Nov 14, 2008 IP
  2. happpy

    happpy Well-Known Member

    Messages:
    926
    Likes Received:
    14
    Best Answers:
    0
    Trophy Points:
    120
    #2
    check your PHP.ini for the socket functions to be ON
     
    happpy, Nov 14, 2008 IP