[英]Delphi TCP Socket Server - broadcast/reply to multiple clients at a time
[英]TCP SOCKET - Stratum Server Reply - OpenEthereumPool
當我通過 /dev/tcp/host/port 連接層服務器時,我發送了 json 並得到了正確的答復。
[water@Swan /tmp]$ exec 5<>/dev/tcp/127.0.0.1/8008;
[water@Swan /tmp]$ echo '{"jsonrpc":"2.0","id":1,"method":"eth_submitLogin","params":["0x00000a..27e"]}' >&5;
[water@Swan /tmp]$ cat <&5
{"id":1,"jsonrpc":"2.0","result":true}
但是,當我嘗試 golang、python、PHP...任何套接字語言時,它都不起作用,程序停在那里。 我嘗試了很多方法socket_recv($socket, $msg, 1000, MSG_DONTWAIT);
要么
while (!feof($fp)){
stream_set_timeout($fp, 1);
echo fgets($fp, 1024);
}
reply := make([]byte, 1024)
_, err = conn.Read(reply)
if err != nil {
println("Write to server failed:", err.Error())
os.Exit(1)
}
println("reply from server=", string(reply))
conn.Close()
他們似乎都沒有工作,但他們都在其他 TCP 服務器上工作。
如何通過程序獲得正確的Stratum TCP REPLY ?
-- 添加了完整的 PHP
<?php
$a = array(
"id" => 1,
"jsonrpc" => "2.0",
"method" => "eth_submitLogin",
"params" => ["0x00000a006459...e"]
);
/*
$a = array(
"id" => 1, "jsonrpc" => "2.0", "method" => "eth_getWork"
);
*/
$b = json_encode($a);
$lb = strlen($b);
$h = "xk.com";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$conn = socket_connect($socket, $h, 8008);
socket_set_nonblock($socket);
var_dump(socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR));
$w = socket_write($socket, $b, $lb);
var_dump($socket, $conn, $w);
sleep(2);
socket_recv($socket, $msg, 1000, MSG_DONTWAIT);
$err = socket_last_error($socket);
var_dump(socket_strerror($err));
socket_close($socket);
var_dump($msg);
您的主機似乎在 JSON 之后等待一個換行符,然后它才會回答。 如果
$b = json_encode($a)."\n";
已使用,您的示例有效。
或者你可以使用
socket_shutdown($socket, 1);
在socket_write()
調用之后,如果您沒有更多要發送的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.