[PHP] raw bytes schrijven naar een socket

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
Hey,

Ik heb een programma genaamd "AGW Packet Engine".
Hiermee kan ik met behulp van de microfoon poort een FM scanner uitlezen.
Dit programma kan de data van de FM scanner dan weer doorsturen via TCP/IP.
Nu wil ik deze data met een PHP scriptje uitlezen.
Hiervoor moet ik verbinding maken met localhost op poort 8000 en dan een "m" frame sturen (een aanvraag om alle FM data te ontvangen)
Nu moet dat in het volgende formaat:

[port][DataKind][CallFrom][CallTo ][DataLen][USER]
4bytes 4bytes 10bytes 10bytes 4bytes 4bytes

waar geld
port=0
DataKind=m
CallFrom=0
CallTo=0
DataLen=0
USER=0
Het probleem is dat php alleen maar strings naar een socket kan schrijven.
Nu is mijn vraag:
Hoe schrijf ik het juiste formaat naar de socket in php?

Ik heb het volgende al geprobeert:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$fp = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($fp, "127.0.0.1", 8000);
$string = 0x00;
$string.=0x00;
$string.=0x00;
$string.=0x00;
$string.="m";
$i=0;
while($i<20)    {
    $string.=0x00;
    $i++;
}
$string.=0x00;$string.=0x00;$string.=0x00;$string.=0x00;
$string.=0x00;$string.=0x00;$string.=0x00;$string.=0x00;    
socket_write($fp,$string);
echo socket_read($fp, 128);
socket_close($fp);
?>

maar PHP blijft dan gewoon hangen bij socket_read wat dus aangeeft dat AGW Packet Engine dus niks terugstuurt.

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-08 12:04

WormLord

Devver

Je zal die 0-waardes via pack in de string moeten zetten.
Nu voeg je telkens de integer waarde 0 toe aan een string, waardoor je string dus een hoop "0"-tekens zal bevatten (niet getest, maar echo die string maar eens voordat je 'm verstuurd.)

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
WormLord schreef op zaterdag 01 mei 2010 @ 16:05:
Je zal die 0-waardes via pack in de string moeten zetten.
Nu voeg je telkens de integer waarde 0 toe aan een string, waardoor je string dus een hoop "0"-tekens zal bevatten (niet getest, maar echo die string maar eens voordat je 'm verstuurd.)
hmm ja klopt inderdaad
ik zal de pack functie even proberen, bedankt
edit: ik heb nu hetvolgende:
PHP:
1
pack('ILCCIL',0x00,0x6D,0x00,0x00,0x00,0x00);

alleen ik weet niet hoe ik ervoor kan zorgen dat die 2 Chars (de 2 C's) allebei 10 bytes lang zijn.
dit is de C++ code die in een demo app gebruikt wordt:
C++:
1
2
3
4
5
6
7
8
9
struct HEADERTCP
{
int port;
long DataKind;
unsigned char callfrom[10];
unsigned char callto[10];
int size;
long User;//reserved
};


edit:
ik heb nu het volgende gedaan:
PHP:
1
$string =pack('ILC10C10IL',0x00,0x6D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);

en dat werkt :) heel erg bedankt

[ Voor 43% gewijzigd door dragontje124 op 01-05-2010 17:44 ]