2016-01-06 47 views
0

我有一個應用程序(充當服務器)寫在c正在原始套接字上偵聽,此套接字描述符:socket(AF_UNIX, SOCK_RAW, 0);。 0表示IPPROTO_IP兩個應用程序之間的原始套接字通信一個在C和一個在java

我想寫一個java代碼(充當客戶端)發送一個ip數據包到這個正在監聽的原始套接字。現在我瞭解到Java需要第三方庫來管理原始套接字。人們推薦junixsocketjuds,所以我會使用其中的一個,我猜。

Junixsocket確實是這樣來定義一個原始套接字:

File socketFile = new File("/path/to/your/socket"); 
AFUNIXSocket sock = AFUNIXSocket.newInstance(); 
sock.connect(new AFUNIXSocketAddress(socketFile)); 

所以,問題是:

是否有可能使這些2個應用程序通過這個原始套接字海誓山盟溝通?在java中,你需要建立socketfilename和path,而在c中不是強制的。我的c代碼沒有指定socketfilename或路徑,所以我不知道如何讓它們在同一個套接字上進行通信。我如何確保它們都在相同的原始套接字上發送/接收?所有這些溝通都只發生在本地!

謝謝

+0

你是什麼意思的socketfilename?你的意思是URL,比如'localhost:8080'或'ip-address:port',這是創建套接字客戶端所必需的。 – 11thdimension

+0

我編輯了問題以回答您的評論 – Pheonix7

回答

0

您正在使用UNIX域套接字(AF_UNIX)。它們針對運行在相同內核上的進程進行了有效設計,並使用文件系統路徑名來尋址(有關詳細信息,請參閱man 4 unix)。所以你必須在兩個進程之間共享一個路徑名。根據要求

編輯:

要設置用C程序Unix域套接字,你需要sockaddr_un類型的地址,並填寫了其sun_path成員與您的插座路徑:

sockaddr_un sockaddr; 
    memset(&sockaddr, 0, sizeof(sockaddr)); 
    sockaddr.sun_family = AF_UNIX; 
    strncpy(sockaddr.sun_path, "/path/to/your/socket", UNIX_MAX_PATH); 

bind()connect()您的套接字到此sockaddr

但是,它與SOCK_RAW無關。如果我錯了,請糾正我的錯誤,但您需要通過Internet的原始套接字,即socket(AF_INET, SOCK_RAW, 0)

+0

不,不,我不想通過互聯網的原始套接字。我想在同一臺機器上的本地。請給我演示一個如何在同一個文件系統路徑名上定義兩個套接字來尋址的例子嗎? – Pheonix7

+0

@ Pheonix7請參閱編輯 – user58697

相關問題