TCP SOCKET - Stratum 服务器回复 - 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_DONTWAIT);
$err = socket_last_error($socket);
var_dump(socket_strerror($err));
socket_close($socket);
var_dump($msg);
not_mature_enough 回答:TCP SOCKET - Stratum 服务器回复 - OpenEthereumPool

您的主机似乎在 JSON 之后等待一个换行符,然后它才会应答。如果

$b = json_encode($a)."\n";

已使用,您的示例有效。

或者你可以使用

socket_shutdown($socket,1);

socket_write() 调用之后,如果您没有更多要发送的内容。

本文链接:https://www.f2er.com/15507.html

大家都在问