Как я могу передать объект Python Socket в DLL, написанную на C? - PullRequest
2 голосов
/ 05 апреля 2011

Есть ли способ преобразования объекта сокета python в пустой указатель?

Я использую ctypes, и я пытался использовать приведение и функции преобразования Python.

Код C, который я пытаюсь преобразовать в python, выглядит так:

long UNILIB_CALL UL_cbOpen ( void **psocket, char * ipAddress, 
    unsigned int port, int connectionTimeout, int sendTimeout, int recvTimeout)  
{  
    printf("%s  %d  ",ipAddress,port);  
    long ssendTimeout=sendTimeout *100;  
    long rrecvTimeout=recvTimeout *100;  
    printf("Address:%u,%u,%u", psocket,*psocket,&psocket);    


    (*psocket)  =  (void*)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    printf("Address after:%u,%u,%u", psocket,*psocket,&psocket);
    getchar();
    RETURN_IF_ERRROR ((SOCKET)(*psocket) == INVALID_SOCKET,"SOCKET", 0);

    long iResult=0;
    //char RecvTimeout[21]; sprintf_s (RecvTimeout, sizeof RecvTimeout, "%d", recvTimeout);
    iResult = setsockopt((SOCKET)(*psocket),SOL_SOCKET,SO_RCVTIMEO, (char*)&rrecvTimeout, 
        rrecvTimeout) ;
    RETURN_IF_ERRROR ( iResult == SOCKET_ERROR,"setsockopt",     WSAGetLastError()); 

    char SendTimeout[21]; 
    sprintf_s (SendTimeout, sizeof SendTimeout, "%d", sendTimeout);
    iResult = setsockopt((SOCKET)(*psocket),SOL_SOCKET,SO_SNDTIMEO, (char*)&ssendTimeout, 
        sizeof ssendTimeout) ;

    RETURN_IF_ERRROR ( iResult == SOCKET_ERROR,"setsockopt",     WSAGetLastError()); 
    SOCKADDR_IN clientService;   
    clientService.sin_family = AF_INET; 
    clientService.sin_addr.s_addr = inet_addr( ipAddress );
    clientService.sin_port = htons( port );

    iResult = connect( (SOCKET)(*psocket), (SOCKADDR*) &clientService, 
        sizeof(clientService) ); 

    RETURN_IF_ERRROR ( iResult == SOCKET_ERROR,"connect",    WSAGetLastError()); 

    return 1;
}

Эквивалентный код Python ->

def UL_cbOpen(psocket,ipAddress,port,connectionTimeout,sendTimeout,recvTimeout):  
    print "Open CallBack\n";  
    print "PORT: {0}".format(port);  
    #print "IPAddress:{0}".format(ipAddress);  
    #print "Port:{0}".format(port);  
    ssendTimeout=c_long();  
    rrecvTimeout=c_long();  
    ssendTimeout=sendTimeout*100;  
    rrecvTimeout=recvTimeout*100;  
    try:  
        psocket=socks.socksocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
        print "Socket created";  
    except:  
        print "Failed to create socket";  
    psocket.setproxy(socks.PROXY_TYPE_SOCKS5,"my.web-proxy.example.com")  
    #PROXY_TYPE_SOCKS4,PROXY_TYPE_HTTP  
    hostname=gethostbyaddr(ipAddress);  
    psocket.setsockopt(SOL_SOCKET, SO_RCVTIMEO, rrecvTimeout);  
    psocket.setsockopt(SOL_SOCKET,SO_SNDTIMEO,ssendTimeout);  
    try:  
        psocket.connect((ipAddress,int(port)));  
        print "Connected to Printer";  
    except:   
        print "Failed Connection";  
    return 1;  

Это функция обратного вызова, и я использовал:

ulopen=WINFUNCTYPE(c_long,POINTER(c_void_p),c_char_p,c_uint,c_int,c_int,c_int);  

чтобы создать обратный звонок. UNILIB_CALL - это __stdcall, и я использовал WinDLL для получения дескриптора библиотеки.

Когда происходит обратный вызов, я получаю сообщение об ошибке:

Указатель на сокет должен быть выделен.

Есть ли способ разыменования указателя на указатель?

Можете ли вы предложить некоторые изменения в коде, чтобы сокеты можно было обрабатывать так же, как это было в коде C?

Ответы [ 2 ]

0 голосов
/ 22 июня 2013

Розетки имеют функцию fileno().

Может быть, вы можете использовать его и создать новый сокет из этого файлового дескриптора.

0 голосов
/ 05 апреля 2011

Преобразование объекта Python в пустой указатель не поможет. Для функции C требуется указатель на объект сокета C, а объект сокета Python отличается от объекта сокета C.

Насколько я знаю, вы не можете использовать Python таким образом, чтобы вернуть сокет для использования на C-программе. Почему вы пытаетесь это сделать?

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