gpt4 book ai didi

java - Android BSD 套接字连接

转载 作者:行者123 更新时间:2023-12-01 06:14:23 25 4
gpt4 key购买 nike

我在尝试将 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));
}

Java native 桥接类:

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

native 类用法:

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

即使没有运行服务器(在设备和模拟器上),“connect”方法也始终返回“0”。

• 我在 list 文件中设置了“INTERNET”权限(没有它,“socket”函数将返回 -1)
• 相同的代码在 iOS 和 Mac OS 上运行得非常好。
• 测试环境:Nexus 5 (4.4.4)、android-ndk-r10d

任何帮助将不胜感激!

最佳答案

byte[] 在 Java 中是有符号的,这意味着你的 |addr|计算很可能是错误的。我怀疑您正在连接到广播地址,根据定义,该地址总是会成功。

尝试从 native 代码打印地址来验证这一点,否则,尝试将计算替换为:

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

看看是否能解决问题。

关于java - Android BSD 套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27837161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com