2013-03-13 72 views
0

我有python3一個過程運行,它必須創建一個模塊調用C庫,但在C LIB它必須調用從python3連接插座,並導致對其python3插座與python3和c嵌入/ C++

[python3] ---> [c] ---> [c socket] ---> [python socket] -----> [c function] -----> [python3]

如何將python類型套接字轉換爲c類型套接字?

幫我舉個例子,謝謝!

回答

1

C套接字只是一個文件描述符,用數字表示。

Python套接字是包裝文件描述符的對象。您可以使用fileno方法獲取文件描述符號。

例如:

def call_c_code_with_socket(my_socket): 
    c_library.c_func(my_socket.fileno()) 

(我假設你是在POSIX這裏;在Windows上,事情有點複雜,因爲您通常使用WSASocket和朋友,這在處理不透明SOCKET手柄而不是簡單的整數。)

換個方式是有點棘手。

如果你已經在C語言中創建了一個套接字,並且想要在Python中使用它,你需要family,type和proto值以及fd數字 - 但是如果你有它們,fromfd就是答案。但是,如果您使用Python創建套接字,則將其文件描述符發送給C,然後將其取回,您不想創建新的套接字對象;你想找到舊的。您可以考慮創建一個dict將fd編號映射到socket對象。

最後,請注意不要將您的一段代碼與另一段代碼做混淆。如果你已經將下一個協議消息的一半讀入C中的緩衝區,那麼Python將會需要這半個消息。如果您已經在Python中將套接字設置爲非阻塞模式,那麼在C中它仍然是非阻塞的。等等。