8

Tôi có ứng dụng Android, mà cần phải thiết lập unix socket kết nối miền với ++ thư viện C (sử dụng Android NDK)truyền LocalSocket với Unix miền trong Android NDK

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

Có LocalSocket trong java mà chấp nhận "chuỗi "(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); 

Nhưng ổ cắm miền unix ở lớp gốc chấp nhận" đường dẫn tuyệt đối ". Vậy hai bên có thể giao tiếp với nhau như thế nào?

Hãy chia sẻ bất kỳ ví dụ nếu có thể

Trả lời

12

LocalSocket sử dụng không gian tên trừu tượng Linux thay vì hệ thống tệp. Trong C, các địa chỉ này được xác định bằng cách thêm '\ 0' vào đường dẫn.

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); 

Cũng lưu ý rằng bạn không nên vượt qua sizeof(sockaddr_un)-bind hoặc sendto vì tất cả các byte theo sau '\ 0' nhân vật được hiểu là tên ổ cắm trừu tượng. Thay vào đó, hãy tính và vượt qua kích thước thực:

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

Điều này đã giúp tôi rất nhiều! Tuy nhiên tôi có một vấn đề với nhận được sockaddr của khách hàng và chiều dài ở phía máy chủ. Tôi muốn khách hàng gửi một thông điệp đến máy chủ (thông qua UDP) và sau đó máy chủ sẽ phản hồi với máy khách bằng thông tin. Tôi sử dụng recvfrom (_serverSocket, _messageBuffer, INPUT_BUFFER, 0, (struct sockaddr *) & _ clientAddress, & _clientAddressLength); ở phía máy chủ, tuy nhiên _clientAddressLength là số không và _clientAddress trống và tôi không thể trả lời ứng dụng khách, mặc dù thực tế là thông điệp từ máy khách đến máy chủ đã được nhận chính xác. –

+0

Đây là mã của tôi http://stackoverflow.com/questions/31755790/sockets-unix-domain-udp-c-recvfrom-fail-to-populate-the-source-address?noredirect=1#comment51445587_31755790 –