我有python3一個過程運行,它必須創建一個模塊調用C庫,但在C LIB它必須調用從python3連接插座,並導致對其python3插座與python3和c嵌入/ C++
[python3] ---> [c] ---> [c socket] ---> [python socket] -----> [c function] -----> [python3]
如何將python類型套接字轉換爲c類型套接字?
幫我舉個例子,謝謝!
我有python3一個過程運行,它必須創建一個模塊調用C庫,但在C LIB它必須調用從python3連接插座,並導致對其python3插座與python3和c嵌入/ C++
[python3] ---> [c] ---> [c socket] ---> [python socket] -----> [c function] -----> [python3]
如何將python類型套接字轉換爲c類型套接字?
幫我舉個例子,謝謝!
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中它仍然是非阻塞的。等等。