经过尝试后发现是给 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);
}