Page 1 of 1

Urgent: PHP program blocked at socket_create() function!

Posted: Fri Nov 14, 2008 4:50 am
by moonriver
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:

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

Code: Select all

<?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. 
    [b]$socket = socket_create(AF_INET,SOCK_STREAM,0);[/b]
 
    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();
?>
===============================================================

Re: Urgent: PHP program blocked at socket_create() function!

Posted: Mon Nov 17, 2008 12:27 am
by XaeroDegreaz
Exotic code...

If your cod worked on another host, please be sure that yout new host:

A. Has the PHP sockets library enabled
B. Has the port open that you are trying to open.