NDK学习笔记(十) POSIX Sockect 面向无连接的通信

2024-06-13 03:18

本文主要是介绍NDK学习笔记(十) POSIX Sockect 面向无连接的通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.接收数据报
  • 2.发送数据报
  • 3.udp服务
  • 4.udp客户端

下面只是代码片段,想看详细的代码请clone代码。
本人没有在android虚拟机上看到通信成功,试了好多配置依然不行,过段时间找两个手机再试试。
运行项目时,如果要看tcp的,则需要更改ClientTask、ServerTask类中的onBackground方法,将jni方法替换成tcp的。udp的也一样,udp的则替换成udp的jni方法。

地址:https://gitee.com/xd_box/NDK_Socket

1.接收数据报

__fd:socket实例
__buf:保存从socket接收的数据
__n:缓冲区大小
__flags:额外标志
__src_addr:保存客户端发送包的协议地址
__src_addr_length:协议地址的内存空间大小成功返回接收到的字节数,失败返回-1
__socketcall ssize_t recvfrom(int __fd, void* __buf, size_t __n, int __flags, struct sockaddr* __src_addr, socklen_t* __src_addr_length);
static ssize_t ReceiveDatagramFromSocket(JNIEnv *env, jobject obj, int sd,struct sockaddr_in *address, char *buffer,size_t bufferSize) {socklen_t addressLength = sizeof(struct sockaddr_in);//从socket中接受数据包LogMessage(env, obj, "从socket接受数据");ssize_t recvSize = recvfrom(sd, buffer, bufferSize, 0, (struct sockaddr *) address,&addressLength);if (-1 == recvSize) {ThrowErrnoException(env, "java/io/IOException", errno);} else {LogAddress(env, obj, "接收到", address);//以NULL种植缓冲区使其为一个字符串buffer[recvSize] = NULL;if (recvSize > 0) {LogMessage(env, obj, "接收到%d字节:%s", recvSize, buffer);}}return recvSize;
}

2.发送数据报

__fd:socket实例
__buf:要发送的数据的指针
__n:缓冲区大小
__flags:额外标志
__dst_addr:目标地址
__dst_addr_length:地址结构大小成功返回传送的字节数,失败但会-1
__socketcall ssize_t sendto(int __fd, const void* __buf, size_t __n, int __flags, const struct sockaddr* __dst_addr, socklen_t __dst_addr_length);
static ssize_t SendDatagramToSpcket(JNIEnv *env, jobject obj, int sd,const struct sockaddr_in *address, const char *buffer,size_t bufferSize) {LogAddress(env, obj, "Sending to", address);ssize_t sentSize = sendto(sd, buffer, bufferSize, 0, (const sockaddr *) address,sizeof(struct sockaddr_in));if (-1 == sentSize) {ThrowErrnoException(env, "java/io/IOException", errno);} else if (sentSize > 0) {LogMessage(env, obj, "sent %d 字节:%s", sentSize, buffer);}return sentSize;
}

3.udp服务

开启udp服务

extern "C"
JNIEXPORT void JNICALL
Java_com_example_testnt_EchoServerActivity_nativeStartUdpServer(JNIEnv *env, jobject thiz,jint port) {int serverSocket = NewUdpSocket(env, thiz);if (NULL == env->ExceptionOccurred()) {BindSocketToPort(env, thiz, serverSocket, (unsigned short) port);if (NULL != env->ExceptionOccurred()) {goto exit;}if (0 == port) {GetSocketPort(env, thiz, serverSocket);if (NULL != env->ExceptionOccurred()) {goto exit;}}struct sockaddr_in address;memset(&address, 0, sizeof(address));char buffer[MAX_BUFFER_SZIE];ssize_t recvSize;ssize_t sentSize;//接收recvSize = ReceiveDatagramFromSocket(env, thiz, serverSocket, &address, buffer,MAX_BUFFER_SZIE);if ((0 == recvSize) || (NULL != env->ExceptionOccurred())) {goto exit;}sentSize = SendDatagramToSpcket(env, thiz, serverSocket, &address, buffer,(size_t) recvSize);if ((0 == sentSize) || (NULL != env->ExceptionOccurred())) {goto exit;}}exit:if (serverSocket > 0) {close(serverSocket);}
}

4.udp客户端

extern "C"
JNIEXPORT void JNICALL
Java_com_example_testnt_EchoClientActivity_nativeStartUdpClient(JNIEnv *env, jobject thiz,jstring ip, jint port,jstring message) {int clientSocket = NewUdpSocket(env, thiz);if (NULL == env->ExceptionOccurred()) {struct sockaddr_in address;memset(&address, 0, sizeof(address));address.sin_family = PF_INET;const char *ipAddress = env->GetStringUTFChars(ip, NULL);if (NULL == ipAddress) {goto exit;}//将IP地址字符串转换为网络地址int result = inet_aton(ipAddress, &(address.sin_addr));env->ReleaseStringUTFChars(ip, ipAddress);if (0 == result) {ThrowErrnoException(env, "java/io/IOException", errno);goto exit;}//转换为网络字节顺序address.sin_port = htons(port);const char *messageText = env->GetStringUTFChars(message, NULL);if (NULL == messageText) {goto exit;}jsize messageSize = env->GetStringUTFLength(message);//发送SendDatagramToSpcket(env, thiz, clientSocket, &address, messageText, (size_t) messageSize);env->ReleaseStringUTFChars(message, messageText);//失败if (NULL != env->ExceptionOccurred()) {goto exit;}char buffer[MAX_BUFFER_SZIE];memset(&address, 0, sizeof(address));ReceiveDatagramFromSocket(env, thiz, clientSocket, &address, buffer, MAX_BUFFER_SZIE);}exit:if (clientSocket > 0) {close(clientSocket);}
}

这篇关于NDK学习笔记(十) POSIX Sockect 面向无连接的通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056122

相关文章

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

IDEA连接达梦数据库的详细配置指南

《IDEA连接达梦数据库的详细配置指南》达梦数据库(DMDatabase)作为国产关系型数据库的代表,广泛应用于企业级系统开发,本文将详细介绍如何在IntelliJIDEA中配置并连接达梦数据库,助力... 目录准备工作1. 下载达梦JDBC驱动配置步骤1. 将驱动添加到IDEA2. 创建数据库连接连接参数

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I