ctypes, проблема с функцией формата вывода c ++ - PullRequest
0 голосов
/ 31 октября 2019

Я создал функцию ctype, которая вызывает библиотеку C ++, которая подключается к сокету и отправляет ему 5-байтовый шестнадцатеричный пакет. Функция connect отправляет шестнадцатеричный код, который я пишу, я правильно вводю ответы периферийных устройств (я проверил их с помощью Wireshark), но код python с ctype не может нормально взаимодействовать с пакетом, который он получает в качестве ответа (всегда 5 байтов). Кто-нибудь может дать мне какие-либо предложения? Где я не прав? В приложении я прилагаю код C ++ с кодом или python и ответом функции.

Я уже пробовал c_char_p, ctypes.POINTER (LP_c_char), ctypes.POINTER (LP_c_char), но ничего не возвращаюфункции всегда 0

код C ++ connect_pe_func.cpp

#include <stdio.h>
#include <errno.h>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstring>
#include <unistd.h>
#include <iostream>
#include <unistd.h>
#include <sstream>

extern "C" char * connect_pe_func(int argc, char *argv[])
{
   int sockfd, n;
   int connected = 0;
   struct sockaddr_in servaddr;
   std::string serveraddr = argv[0];

   sockfd = socket(AF_INET, SOCK_STREAM, 0);

   bzero(&servaddr, sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr = inet_addr(serveraddr.c_str());
   servaddr.sin_port = htons(9761);

   connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

   std::string pref_hex;
   std::string hex("0x");
   std::string test = argv[1];
   size_t numbytes = test.size() / 2;
   uint8_t command[numbytes];

   for (size_t w = 0, x = 0; w < numbytes; ++w, x += 2)
   {
      pref_hex = hex + test.substr(x, 2);
      //cout << pref_hex;
      command[w] = stoi(pref_hex, nullptr, 16);
   }

   int bytes_to_send = sizeof(command);

   send(sockfd, command, bytes_to_send, 0);
   uint8_t output_command[numbytes];
   recv(sockfd, output_command, bytes_to_send, 0);
   close(sockfd);
   char test_out[10];

   for (size_t w = 0, x = 0; w < numbytes; ++w, x += 2)
   {
      test_out[x] = (char)output_command[w];
   }
   return test_out;

}

код Python

import sys
import ctypes

lib = ctypes.CDLL('./connect_pe_func.so')

LP_c_char = ctypes.POINTER(ctypes.c_char)
LP_LP_c_char = ctypes.POINTER(LP_c_char)

lib.connect_pe_func.argtypes = (ctypes.c_int, LP_LP_c_char)
lib.connect_pe_func.restypes = ctypes.c_char_p
argv = ["192.168.2.170","2600000026"]
argc = len(argv)

p = (LP_c_char*len(argv))()
for i, arg in enumerate(argv):  # not sys.argv, but argv!!!
  enc_arg = arg.encode('utf-8')
  p[i] = ctypes.create_string_buffer(enc_arg)

na = ctypes.cast(p, LP_LP_c_char)

lib.connect_pe_func(argc, na)

Я ожидал вывод кода Python, например, 26810000a7, но фактическийвыход всегда 0

...