2016-06-17 2 views
-1

내 프로젝트 (게임용)에서 C 네트워크 인터페이스가 필요합니다.파이썬에 C++ 클래스를 래핑 할 때의 문제

#include <iostream> 
#include <string> 
#include "Socket.h" 
#include "stdio.h" 

void  Socket::s_connect(char *host, int port){ 
    const char *str; 
    pe = getprotobyname("tcp"); 
    if (!pe){ 
     perror("Error get protocol"); 
     exit(1); 
    } 
    f = socket(AF_INET, SOCK_STREAM, pe->p_proto); 
    if (f == -1){ 
     perror("Error create socker"); 
     exit(1); 
    } 
    s_in.sin_family  = AF_INET; 
    s_in.sin_port  = htons(port); 
    s_in.sin_addr.s_addr = inet_addr(host); 
    if (connect(f, (const struct sockaddr *&)s_in, sizeof(s_in)) == -1){ 
     perror("Error on connect"); 
     close(f); 
    } 
} 


void  Socket::s_send(char *msg){ 
    if (write(f, msg, strlen(msg)) == -1){ 
     printf("error write\n"); 
     perror("write"); 
     exit(1); 
    } 
} 

char  *Socket::s_recv(){ 
    char *buff; 
    int  ret; 

    buff = (char *)malloc(4096); 
    ret = read(f, buff, 4096); 
    if (ret < 0){ 
     if (close(f)) 
      exit(1); 
    } 
    return buff; 
} 
extern "C" { 
    Socket *Socket_new() 
    { 
     return (new Socket); 
    } 

    void Socket_connect(Socket *sock, char *host, int port) 
    { 
     sock->s_connect(host, port); 
    } 

    void Socket_send(Socket *sock, char *msg) 
    { 
     sock->s_send(msg); 
    } 
} 

Socket.h : 내 파이썬 코드에서 c-types와 함께 사용, C TCP 소켓 함수에서 C++ 래퍼를 생성 그래서 파이썬에서 내 프로젝트를 코딩 할

#ifndef SOCKET_HPP_ 
# define SOCKET_HPP_ 


#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <errno.h> 

class Socket { 
    int     f, port; 
    struct protoent  *pe; 
    struct sockaddr_in s_in; 
    char    *ip; 
public: 
    void s_connect(char *host, int port); 
    void s_send(char * msg); 
    char *s_recv(); 
}; 

#endif 

그리고 파이썬에서 보낸

#!/usr/bin/python 

import sys 
from ctypes import cdll 

lib = cdll.LoadLibrary('./libsocket.so') 

class Socket(object): 
    def __init__(self): 
     self.obj = lib.Socket_new() 


    def s_connect(self, host, port): 
     print(host, port) 
     lib.Socket_connect(self.obj, host, int(port)) 


    def s_send(self, msg): 
     lib.Socket_send(self.obj, msg) 

    def s_recv(self): 
     lib.Socket_recv(self.obj) 

    def main(arg): 
     sock = Socket() 
     sock.s_connect(arg[1], arg[2]) 
     sock.s_send("coucou") 

    if __name__ == "__main__": 
     main(sys.argv) 

그리고 내 통근 C func 읽을 수 없습니다 내 캐릭터 나 호스트의 문자열 값을 읽을 수 없습니다 포트 번호하지만 내 C++ 기능을 보낼 수 있습니다 내 파이썬 클래스가있다. char *std::string으로 변경하면 같은 문제가 발생합니다. 내가 잘못 했습니까?

감사

+0

IT는 PYT를 사용하는 것이 많아서 쉽게 hon 소켓 모듈. – cdarke

+0

네, 알지만, 제 프로젯에는 C 네트워크 인터페이스가 필요합니다. 제 프로젝트의 강의 중 하나입니다. – RieuxThomas

+1

흠, 파이썬 2 또는 파이썬 3을 사용합니까? 문자의 크기에 문제가 있습니다 ... –

답변

1

당신은 당신이 (파이썬 3 버전, 파이썬 유니 코드 문자열 (str)는 C의 넓은 문자 배열 (wchar_t *)에 해당하는 ctypes 모듈 상태에 대한 설명서, 그 파이썬 바이트 문자열을 사용 말하는 것처럼 bytes)는 좁은 문자 배열 (char *)에 해당합니다.

당신이 실제로 유니 코드 문자를 처리, 당신이해야 할 경우에 따라서 따라 :

  • 중 (사소한) bytes 파이썬 측 사용

    sock.s_connect(arg[1].encode('latin1'), arg[2]) 
    
  • 또는 아마 더 열심히 (wchar_t C면을 사용하여 ...)

+0

고맙습니다! – RieuxThomas

관련 문제