首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android BSD套接字连接

Android BSD套接字连接
EN

Stack Overflow用户
提问于 2015-01-08 17:50:38
回答 1查看 512关注 0票数 1

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

JNI部分:

代码语言:javascript
复制
#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本机网桥类:

代码语言:javascript
复制
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);
}

本机类用法:

代码语言:javascript
复制
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”,即使没有服务器在运行(在设备和模拟器上)。

·我使用清单文件设置了"INTERNET“权限(如果没有它,"socket”函数将返回-1)

·相同的代码在iOS和Mac上运行得很好。

·测试环境: Nexus 5 (4.4.4),android-ndk-r10d

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2015-01-09 06:47:01

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

尝试通过打印本机代码中的地址来验证,否则,请尝试将计算替换为:

代码语言:javascript
复制
int addr = (address[0] & 255) << 24 | 
           (address[1] & 255) << 16 |
           (address[2] & 255) <<  8 |
           (address[3] & 255);

看看这是否能解决问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27837161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档