JNI 和 socket api
1、JavaVM 和 JNIEnv
JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立。
JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程都可以使用这个JavaVM。
当后台线程需要调用JNI native时,在native库中使用全局变量保存JavaVM尤为重要,这样使得后台线程能通过JavaVM获得JNIEnv。
// e.g
JNIEnv *env = NULL;
if(0 == gVm-> AttachCurrentThread(&env, NULL)){}
2、Socket API: 面向连接的通信
int socket(int domain, int type, int protocol);
创建一个socket
domain: 指定将会产生通信的socket域,并选择将要用到的协议簇:
PF_LOCAL:主机内部通信协议簇,该协议簇使物理上运行的同一台设备上的应用程序可以用Socket APIs彼此通信;
PF_INET: Internet第4版协议簇,该协议簇使应用程序可以与网络上的其他地方运行的应用程序进行通信;
type:指定通信的语义,支持一下几种主要的socket类型。
SOCKET_STREAM: 通过使用TCP协议的、面向面向连接的通信Stream Socket类型;
SOCKET_DGRAM:提供使用UDP协议的,无连接的通信Datagram Socket类型。
protocol: 指定将会用到的协议;
int bind(int socketDescriptor, const struct sockaddr *address, socklen_t addressLength);
将socket与一个地址绑定
socket描述符:指定将绑定到指定地址的socket实例;
address:指定socket被绑定的协议地址;
address length:指定传递给函数的协议地址结构的大小;
int listen(int socketDescriptor, int backlog);
监听socket
socket 描述符,
backlog:指定保存挂起的输入连接的队列大小。
int accept(int socketDescriptor, struct sockaddr *address, socklen_t * addressLength);
用来显示的将输入连接从监听队列取出并接受它;
socket描述符;
address:一个指向客户协议地址的指针,可以为NULL;
addressLength: 客户协议大小,可以为NULL;
ssize_t recv(int socketDescriptor, void *buffer, size_t bufferLength, int flags);
从socket 接收数据
socket描述符;
buffer: 指向内存地址,用来保存从socket接收数据;
bufferLength:缓冲区大小;
flags:接收所需要的额外标志;
ssize_t recvfrom(int socketDescriptor, void *buffer, size_t bufferLength, int flags, struct sockaddr *address, socklen_t *addressLength);
使用recvfrom从udp socket中接收数据;
socketDescriptor;
buffer: 指向内存地址的指针;
bufferLength: 缓存区大小
flags: 额外标记
address:用于保存客户端发送的协议地址,可以为NULL
addressLength: 指定客户端要写入的协议地址的内存大小,可以为NULL;
ssize_t send(int socketDescriptor, void *buffer, size_t bufferLength, int flags);
想socket发送数据
socket描述符;
buffer: 指向内存地址;
bufferLength:长度;
flags:发送所需要的额外标志;
ssize_t sendto(int socketDescriptor, const void *buffer, size_t bufferSize, int flags, const struct sockaddr *address, socklen_t, addressLength);‘’
udp发送函数
socketDescriptor;
buffer: 缓冲区指针
bufferLength:缓冲区大小;
flags: 额外标记
address:协议地址
addressLength:协议地址大小
int connect(int socketDescriptor, const struct sockaddr *addr, socklen_t addressLength);
通过提供协议地址来连接socket和server socket,
socket描述符;
address: socket要连接的协议地址;
addressLength: 所提供的地址结构的长度;
异步IO
sys/select.h
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
nfds:为最高编号的描述符+1,select函数将监控nfds指定数量的描述符。
readfds:设置将被监控可读性的描述符列表集;
writefs:设置将被监控可写性的描述符列表集;
exceptfds:设置将被监控任何类型错误的描述符列表集;
timeout: 指定为了完成选择而阻塞当前进程的最大时间间隔,可以为NULL;
参考:《Android C++高级编程》 8/9/10章
JNI 和 socket api的更多相关文章
- JAVA Socket API与LINUX Socket API探究
代码 这是一个带有UI界面的JAVA网络聊天程序,使用Socket连接完成通信. JAVA服务端程序 import java.io.IOException; import java.io.InputS ...
- Creating Your Own Server: The Socket API, Part 2
转:http://www.linuxforu.com/2011/09/creating-your-own-server-the-socket-api-part-2/ By Pankaj Tanwar ...
- Creating Your Own Server: The Socket API, Part 1
转:http://www.linuxforu.com/2011/08/creating-your-own-server-the-socket-api-part-1/ By Pankaj Tanwar ...
- UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...
- c/c++ socket API 调用后的错误判断 perror errno
socket API 调用后的错误判断 perror errno 调用完socket API后,需要判断调用是否成功与失败.如果失败,会自动设置errno(是个整数), 并且用perror可以打印出具 ...
- LwIP - raw/callback API、协议栈API(sequential API)、BSD API(或者说 SOCKET API)
1.使用raw/callback API编程,用户编程的方法是向内核注册各种自定义的回调函数,回调函数是与内核实现交换的唯一方式. recv_udp, accept_function, sent_tc ...
- socket编程 ------ BSD socket API
伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...
- Python Socket API 笔记
将上节中的C#该成Python版的容易程度大大超出了我的意料之外.从来没有发现,仅仅用灰尘简单的几句话就实现了该程序的主要功能,可见python的简易和强大之处.这里先对SocketAPI 做一下总结 ...
- TCP协议和socket API 学习笔记
本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilb ...
随机推荐
- 很有用的PHP笔试题系列三
1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION 与 COOKIE的区别是什么,请从 ...
- [DForm]我也来做自定义Winform之另类标题栏重绘
据说得有楔子 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还要来个序 其实,很多年没写过Winform了,前端时间在 ...
- 求大神帮忙解决一下c#winfrom bindingNavigatorPositionItem加载直接跳转问题
c# winfrom bindingNavigatorPositionItem控件问题加载直接跳转到相对应的行的问题
- js使用占位符替换字符串
js使用占位符替换字符串是一个ES6中的模版字符串语法. 在``中使用 ${} var a = 5; var b = 10; console.log(`Fifteen is ${a + b} and ...
- [转]谷歌Chrome浏览器开发者工具教程—基础功能篇
来源:http://www.xiazaiba.com/jiaocheng/5557.html Chrome(F12开发者工具)是非常实用的开发辅助工具,对于前端开发者简直就是神器,但苦于开发者工具是英 ...
- Facade模式实现文件上传(Flash+HTML5)
一.前言 确定了渐进式增强的上传方式,接下来我们需要将上传功能从具体的业务逻辑中剥离出来,作为公共组件供业务层调用.这就要求我们必须对业务层隐藏上传细节,只暴露统一的上传API.这时候大家是不是跟我一 ...
- java常用API之基本类型包装类
基本类型包装类概述: 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的. 而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型. 想实现字符串与基本数据之间转换,需 ...
- collectd配置
udp proxy - 192.168.48.112 cat > /etc/collectd_25801.conf << EOF Hostname "kvm-48-112& ...
- *Amazon problem: 234. Palindrome Linked List (reverse the linked list with n time)
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- jsonp跨域请求响应结果处理函数(python)
接口测试跨域请求接口用的jsonp,需要将回调函数里的json字符串提取出来. jsonp跨域请求的响应结果格式: callback_functionname(json字符串). #coding:ut ...