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(); ?>