次の C# コードは、継承したサービスで使用され、小さな整数を 3 バイトに変換して、ソケット経由で送信できるようにします。
int i = 12345;
byte[] data = new byte[] { (byte)i, (byte)(i >> 8), (byte)(i >> 16)};
var result = data[0] + (data[1] << 8) + (data[2] << 16);
PHP を使用して、サービスへのソケットを開いています。通信プロトコルはバイト レベルで記述されているため、PHP ソケット経由でバイトを送信する必要があります。
これを行うには、 pack 関数を使用する必要があると判断しました。
<?php
$binarydata = pack("CCCC", 0xFF, 0x00, 0x00, 0x00);
socket_write($sk, $binarydata, $binarydataLen);
?>
最初のバイトは、クライアントが何をしたいのかをサーバーに伝えます。この場合、次の 3 バイトは、上記の c# 実装に示されている式に準拠する整数を表す必要があります。
私が抱えている問題は、何を試しても、c# 実装に一致する整数から 3 バイト配列を作成できないことです。
これを解決するのに役立つ人に本当に感謝し、投票します。経験豊富な PHP 開発者は、使用する正しい構文を知っていると思います。
ありがとうございました。キリスト教徒
編集:ここにプロトタイプがあります
//The Client
error_reporting(E_ALL);
$address = "127.0.0.1";
$port = <removed>;
/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "socket successfully created.\n";
}
echo "Attempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "successfully connected to $address.\n";
}
$value = 17;
$binarydata = pack("c*", 0xFE, $value & 0x000F, ($value>>8) & 0x000F, ($value>>16) & 0x000F);
socket_write($socket, $binarydata, 4);
$input = socket_read($socket, 2048);
echo "Response from server is: $input\n";
sleep(5);
echo "Closing socket...";
socket_close($socket);
期待される出力は "FE 11 00 00" (11 は 17) です。
残念ながら、ログによると「FE 01 00 00」を送信しています:-(
サーバーは ASCII で応答するため、動的に変化するため、この番号を正しく取得する必要があります。
編集:すべてありがとう、それは働いています!xD
$binarydata = pack("cc*", 0xFE, $value, ($value>>8), ($value>>16));