Urgent: PHP program blocked at socket_create() function!

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
moonriver
Forum Newbie
Posts: 1
Joined: Fri Nov 14, 2008 4:30 am

Urgent: PHP program blocked at socket_create() function!

Post 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();
?>
===============================================================
XaeroDegreaz
Forum Newbie
Posts: 10
Joined: Mon Nov 10, 2008 9:09 pm

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

Post 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.
Post Reply