8

我的Android應用程序,這需要建立與 我們的C++庫(使用Android NDK)與Unix領域中的Android NDK

public static String SOCKET_ADDRESS = "your.local.socket.address"; // STRING 

有LocalSocket在java中它接受「串Unix域套接字連接LocalSocket通信「(your.local.socket.address)

#define ADDRESS  "/tmp/unix.str" /* ABSOLUTE PATH */ 
    struct sockaddr_un saun, fsaun; 
    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { 
     perror("server: socket"); 
     exit(1); 
    } 
    saun.sun_family = AF_UNIX; 
    strcpy(saun.sun_path, ADDRESS); 

但在本地層的unix域套接字接受」絕對路徑「。那麼這兩方如何相互溝通呢?

請分享任何例如,如果可能的

回答

12

LocalSocket使用Linux抽象名稱空間而不是文件系統。在C中,這些地址是通過在路徑中加上'\ 0'來指定的。

const char name[] = "\0your.local.socket.address"; 
struct sockaddr_un addr; 
addr.sun_family = AF_UNIX; 

// size-1 because abstract socket names are *not* null terminated 
memcpy(addr.sun_path, name, sizeof(name) - 1); 

還要注意的是,因爲繼「\ 0」字符被解釋爲抽象的套接字名稱的所有字節不應傳遞sizeof(sockaddr_un)bindsendto。計算並通過實際大小,而不是:

int res = sendto(sock, &data, sizeof(data), 0, 
       (struct sockaddr const *) &addr, 
       sizeof(addr.sun_family) + sizeof(name) - 1); 
+0

這幫了我很多!不過,我在獲取客戶端的sockaddr和服務器端的長度時遇到了問題。我希望客戶端向服務器發送消息(通過UDP),然後服務器應該用信息響應客戶端。我使用recvfrom(_serverSocket,_messageBuffer,INPUT_BUFFER,0,(struct sockaddr *)&_ clientAddress,&_clientAddressLength);在服務器端,儘管_clientAddressLength爲零,並且_clientAddress爲空,並且我無法響應客戶端,儘管從客戶端到服務器的消息被正確接收。 –

+0

這是我的代碼http://stackoverflow.com/questions/31755790/sockets-unix-domain-udp-c-recvfrom-fail-to-populate-the-source-address?noredirect=1#comment51445587_31755790 –