Android NDK Socket 收不到UDP包

经过尝试后发现是给 socket 设置端口的方式错了,在此记录一下。

之前的错误代码是这样的:

fromAddr.sin_family = AF_INET;
fromAddr.sin_addr.s_addr = htonl(INADDR_ANY);
fromAddr.sin_port = 2234;

正确的设置方式是:

fromAddr.sin_family = AF_INET;
fromAddr.sin_addr.s_addr = htonl(INADDR_ANY);
fromAddr.sin_port = htons(2234);

关于 htons,参见 socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

以下代码实现了接收 UDP 包并将内容返回

#include <jni.h>
#include <string>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#include <android/log.h>

static const char *TAG = "uart";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,  TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_cmakeapplication_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {

    int sock;
    int port = 2234;

    struct sockaddr_in toAddr;
    struct sockaddr_in fromAddr;

    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if (sock < 0) {
        LOGE("Socket 创建失败");
    }

    fromAddr.sin_family = AF_INET;
    fromAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    fromAddr.sin_port = htons(port);

    if (bind(sock, (struct sockaddr *) &fromAddr, sizeof(fromAddr)) < 0) {
        LOGE("绑定失败");
    }

    char buffer[1024] = {'a', 'b'};
    socklen_t toAddrLen = sizeof(toAddr);

    int size = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *) &toAddr, &toAddrLen);

    if (size < 0) {
        LOGE("无数据");
    }
    LOGE("接收到的数据:%s\r\n", buffer);

    return env->NewStringUTF(buffer);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值