2016-06-17 6 views
-1

私のプロジェクト(ゲーム用)には、Cネットワークインターフェイスが必要です。Pythonに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::私は私のPythonコードでc-typesでそれを使用するために、C TCPソケット関数からのC++ラッパーを作成したので、私はPythonで私のプロジェクトをコーディングしたい

#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 

そして、私のPythonのクラスがあります:C funcは、Pythonから送られた私の文字列を読み取ることができません

#!/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) 

そして私はextern私は、ポート番号が、私のC++関数は、ホストの文字列値を読み取ることができません送信することができます。 char *std::stringに変更すると、同じ問題が発生します。 私は何か間違っていましたか?

おかげ

+0

これは非常に使いやすいですhon 'socket'モジュールです。 – cdarke

+0

はい、わかりましたが、私のプロジェクトにはCネットワークインターフェイスが必要です。これは私のプロジェクトの指示です。 – RieuxThomas

+1

ええと、あなたはPython2かPython3を使いますか?文字サイズが問題になります... –

答えて

1

あなたはPythonの3バージョンを使用して言うように、​​モジュールのドキュメントは、PythonのUnicode文字列(str)はC(wchar_t *)でワイド文字の配列に対応することを述べ、およびPythonのバイト文字列(つまりbytes)は、狭い文字配列(char *)に対応します。

ですから、実際にはプロセスのUnicode文字にしたい場合は、あなたがすべきによって:

  • のいずれか(ささい)bytes Pythonの側を使用します。

    sock.s_connect(arg[1].encode('latin1'), arg[2]) 
    
  • か(おそらく難しいwchar_t C側を使用します...)

+0

ありがとうございます! – RieuxThomas

関連する問題