Ошибка перевода кода из Python в C ++ - PullRequest
0 голосов
/ 27 мая 2020

Я пробовал спеть этот код от Python до C ++:

import socket

host, port, length = '127.0.0.1', 3000, 8

sock = socket.create_connection((host, port))
sock.send(b'\x02\x01\x00\x00\x00\x00\x006build\nedition\nnode\nservice\nservices\nstatistics\nversion')
buf = bytearray(length)
buf = bytearray(length)
view = memoryview(buf)
while length > 0:
    nbytes = sock.recv_into(view, length)
    view = view[nbytes:]
    length -= nbytes
print(buf)

Используется boost::asio::ip::tcp::socket. Вот часть кода, которая отвечает за отправку запроса и получение ответа:

boost::asio::io_service service;
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 3000);
boost::asio::ip::tcp::socket sock(service);
sock.open(boost::asio::ip::tcp::v4());
sock.connect(ep);
sock.write_some(boost::asio::buffer("\x02\x01\x00\x00\x00\x00\x006build\nedition\nnode\nservice\nservices\nstatistics\nversion"));
char buff[1024];
sock.read_some(boost::asio::buffer(buff,1024));
sock.shutdown(boost::asio::ip::tcp::socket::shutdown_receive);
sock.close();
std::cout << buff;

Однако этот код зависает при получении ответа (при выполнении sock.read_some()). Что здесь можно изменить / исправить?

1 Ответ

0 голосов
/ 27 мая 2020

Я скомпилировал ваш клиент C ++, немного изменил его.

#include <iostream>
#include <boost/asio.hpp>

int main(int, char**) {
    boost::asio::io_service service;
    boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 3000);
    boost::asio::ip::tcp::socket sock(service);
    sock.open(boost::asio::ip::tcp::v4());
    sock.connect(ep);
    sock.write_some(boost::asio::buffer("the test message"));
    char buff[1024];
    auto rcvd_bytes = sock.read_some(boost::asio::buffer(buff,1024));
    std::cout << "rcvd_bytes:" << rcvd_bytes << '\n';
    sock.shutdown(boost::asio::ip::tcp::socket::shutdown_receive);
    sock.close();
    std::cout << buff << '\n';
}

Получаю socketserver.TCPServer Example

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 3000

    # Create the server, binding to localhost on port 9999
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

Я запустил оба приложения и все вроде работает.

Сервер

127.0.0.1 wrote:
b'the test message\x00'

Клиент

rcvd_bytes:17
THE TEST MESSAGE

Боюсь, без реального кода сервера и соответствующего окружения это сложно понять что не работает в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...