2010-01-25 14 views
2

Je suis très nouveau à Erlang, et je convertis certains de mes trucs PHP, et je ne peux pas comprendre celui-ci. Voici la fonction en PHP:Erlang Binary Packet

public function raw_send($string1, $string2 = NULL, $type = SERVERDATA_EXECCOMMAND) { 
$data = pack('VV', $this->get_request_id(), $type) . $string1 . chr(0) . $string2 . chr(0); // build data 
$packet = pack('V', strlen($data)) . $data; 
fwrite($this->fp, $packet, strlen($packet)); 
} 

Ceci est ma tentative:

raw_send(Sock, String1, String2, Type) -> 
    RequestId = random:uniform(10), 
    PacketData = list_to_binary([<<RequestId, Type>>, String1, 0, String2, 0]), 
    DataLength = byte_size(PacketData), 
    Packet = list_to_binary([<<DataLength>>, PacketData]), 
    ok = gen_tcp:send(Sock, Packet). 

J'ai essayé d'utiliser crc32 pour comparer les choses, paquet ("VV", 1, 3) en php doit = < < 1/non signé-petit, 3/non signé-petit >>, non?

En outre, les spécifications de ce que je suis en train de faire: http://developer.valvesoftware.com/wiki/Source_RCON_Protocol

Halp!

Merci

+0

Quel est le problème avec votre tentative? – Zed

Répondre

1

a obtenu, n'a pas été en utilisant des entiers 32 bits! (Merci à ndim @ freenode)

raw_send(Sock, String1, String2, Type) -> 
    RequestId = random:uniform(10), 
    String1Bin = list_to_binary(String1), 
    String2Bin = list_to_binary(String2), 
    PacketData = <<RequestId:32/little, Type:32/little, String1Bin/binary, 0, String2Bin/binary, 0>>, 
    DataLength = byte_size(PacketData), 
    Packet = <<DataLength:32/little, PacketData/binary>>, 
    ok = gen_tcp:send(Sock, Packet). 

Espérons que ça aide quelqu'un!