2015-01-08 210 views
1

我在嘗試將BSD客戶端套接字連接到服務器時遇到一些問題。 使用JNI實現套接字創建和連接。實際的連接是通過java代碼建立的。Android BSD套接字連接

JNI部分:

#include <jni.h> 

#include <unistd.h> 
#include <string.h> 

#include <sys/endian.h> 
#include <sys/ioctl.h> 

#include <sys/errno.h> 
#include <sys/socket.h> 
#include <sys/poll.h> 
#include <netinet/in.h> 

JNIEXPORT jint JNICALL Java_com_example_socketclinet_Native_socket 
(JNIEnv *, jclass, jint, jint, jint); 

JNIEXPORT jint JNICALL Java_com_example_socketclinet_Native_connect 
(JNIEnv *, jclass, jint, jint, jint); 

jint JNICALL Java_com_example_socketclinet_Native_socket 
(JNIEnv *env, jclass cls, jint domain, jint type, jint protocol) 
{ 
    return socket(domain, type, protocol); 
} 

jint JNICALL Java_com_example_socketclinet_Native_connect 
(JNIEnv *env, jclass cls, jint socket, jint address, jint port) 
{ 
    struct sockaddr_in addr; 
    memset(&addr, 0, sizeof(struct sockaddr_in)); 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = htonl(address); 
    addr.sin_port = htons(port); 
    return connect(socket, (const struct sockaddr *)&addr, sizeof(struct sockaddr_in)); 
} 

Java本地橋類:

class Native 
{ 
    static 
    { 
     System.loadLibrary("mylib"); 
    } 

    public static final int SOCK_STREAM = 2; 
    public static final int AF_INET = 2; 

    public static native int socket(int domain, int type, int protocol); 
    public static native int connect(int socket, int address, int port); 
} 

機類的用法:

int socket = Native.socket(Native.AF_INET, Native.SOCK_STREAM, 0); 
if (socket < 0) 
{ 
    System.err.println("Socket error: " + socket); 
    return; 
} 

byte[] address = { .... }; // 192.168.xxx.xxx 
int addr = address[0] << 24 | address[1] << 16 | address[2] << 8 | address[3]; 
int port = ....; 

int result = Native.connect(socket, addr, port); 
if (result < 0) 
{ 
    System.err.println("Connection failed: " + result); 
} 
else 
{ 
    System.out.println("Connected"); 
} 

「連接」 方法總是返回 「0」,即使沒有服務器在運行(在設備和模擬器上)。

•我有「INTERNET」許可與清單文件設置(如果沒有它「套接字」函數返回-1)
•相同的代碼工作完全正常在iOS和Mac OS。
•測試環境:Nexus 5(4.4.4),android-ndk-r10d

任何幫助將不勝感激!

回答

-1

byte []在Java中籤名,表示您的| addr |計算可能是錯誤的。我懷疑你正在連接到一個廣播地址,根據定義它總是會成功。

嘗試從本地代碼打印地址,通過驗證,否則,嘗試更換計算:

int addr = (address[0] & 255) << 24 | 
      (address[1] & 255) << 16 | 
      (address[2] & 255) << 8 | 
      (address[3] & 255); 

,看看是否能解決問題。

+0

您無法將TCP套接字連接到廣播地址。 – EJP

+0

@Digit,它沒有工作。另外,試圖在本地代碼中對地址進行硬編碼 - 沒有運氣。我最終在java中編寫socket通信代碼並添加了一個JNI綁定(像魅力一樣工作)。 –