Urgent: PHP program blocked at socket_create() function!
Posted: Fri Nov 14, 2008 4:50 am
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:
===============================================================
===============================================================
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();
?>