내 프로젝트 (게임용)에서 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
으로 변경하면 같은 문제가 발생합니다. 내가 잘못 했습니까?
감사
IT는 PYT를 사용하는 것이 많아서 쉽게 hon 소켓 모듈. – cdarke
네, 알지만, 제 프로젯에는 C 네트워크 인터페이스가 필요합니다. 제 프로젝트의 강의 중 하나입니다. – RieuxThomas
흠, 파이썬 2 또는 파이썬 3을 사용합니까? 문자의 크기에 문제가 있습니다 ... –