2015-01-08 2 views
1

У меня возникают некоторые проблемы при попытке подключить клиентский сокет BSD к серверу. Создание и подключение гнезда реализованы с помощью JNI. Фактическое соединение устанавливается через java-код.Соединение сокетов BSD для Android

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", даже если нет сервера (как на устройстве, так и на симуляторе).

• У меня есть разрешение «ИНТЕРНЕТ» с файлом манифеста (без него «функция сокета» возвращает -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 и добавил привязку JNI (работал как шарм). –

Смежные вопросы