Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android BSD套接字连接_Java_Android_Sockets_Android Ndk_Java Native Interface - Fatal编程技术网

Java Android BSD套接字连接

Java Android BSD套接字连接,java,android,sockets,android-ndk,java-native-interface,Java,Android,Sockets,Android Ndk,Java Native Interface,尝试将BSD客户端套接字连接到服务器时遇到一些问题。 套接字创建和连接是用JNI实现的。实际连接是通过java代码建立的 JNI部分: #include <jni.h> #include <unistd.h> #include <string.h> #include <sys/endian.h> #include <sys/ioctl.h> #include <sys/errno.h> #include <sys

尝试将BSD客户端套接字连接到服务器时遇到一些问题。 套接字创建和连接是用JNI实现的。实际连接是通过java代码建立的

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));
}
本机类用法:

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");
}
intsocket=Native.socket(Native.AF\u INET,Native.SOCK\u STREAM,0);
如果(插座<0)
{
System.err.println(“套接字错误:+Socket”);
返回;
}
字节[]地址={….};//192.168.xxx.xxx

int addr=address[0]byte[]是用Java签名的,这意味着您的| addr |计算可能是错误的。我怀疑您正在连接到广播地址,根据定义,广播地址将始终成功

请尝试从本机代码打印地址至,以验证是否存在,否则,请尝试将计算替换为:

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

int addr=(地址[0]&255)您不能将TCP套接字连接到广播地址。@Digit,它不起作用。另外,试图用本机代码硬编码地址-运气不好。最后,我用java编写了套接字通信代码,并添加了一个JNI绑定(工作起来很有魅力)。
int addr = (address[0] & 255) << 24 | 
           (address[1] & 255) << 16 |
           (address[2] & 255) <<  8 |
           (address[3] & 255);