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章

时间: 2024-10-08 10:32:26

JNI 和 socket api的相关文章

LwIP - raw/callback API、协议栈API(sequential API)、BSD API(或者说 SOCKET API)

1.使用raw/callback API编程,用户编程的方法是向内核注册各种自定义的回调函数,回调函数是与内核实现交换的唯一方式. recv_udp, accept_function, sent_tcp, recv_tcp, do_connected, poll_tcp, err_tcp! 2.协议栈API(sequential API)是基于raw/callback API实现的,它与内核交换的方式也只能通过回调. netconn_new, netconn_delete, netconn_ge

Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <纲要> Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理 UDP服务器 客户端最小模型,处理字符转大写 TCP 多进程并发服务器模型,为每个客户端开启一个进程: TCP 多线程服务器模型,使用wrap函数封装 作业: ---------------------------------------------------- UDP服务器 客户端最小模型,处理字符转大写 [em

TCP协议和socket API 学习笔记

本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilbertjuly  • TCP包头 ACK为1时,确认序号有效,表示期望收到的下一个序号,是上次成功收到的字节序加1. SYN, FIN都占用一个序号. • TCP连接的建立 client通过connect()来建立TCP连接,connect()会发送SYN报文: server通过bind().list

tcp 三次握手和四次断连深入分析:连接状态和socket API的关系

说到tcp协议,凡是略微看过的人都能顺口说出三次握手和四次断连.再牛逼的一点的就能够把每一个状态(SYNC_SENT.CLOSE_WAIT. ... ..等)都能背出来, 而说道socket编程.基本上写过网络编程的人都会熟悉那几个标准的API:socket.connect.listen.accept.... ..等 可是.我敢打赌非常少有人明确tcp状态和socket编程API之间的关系.不信? 看看例如以下几个问题你是否知道吧: 1)什么时候客户端才干够连接上server端, 是server

Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select poll epoll udp组播 线程池

[本文谢绝转载原文来自http://990487026.blog.51cto.com] Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select  poll  epoll udp组播 线程池 TCP 11种状态理解: 1,客户端正常发起关闭请求 2,客户端与服务端同时发起关闭请求 3,FIN_WAIT1直接转变TIME_WAIT 4,客户端接收来自服务器的关闭连接请求 多路IO转接服务器: select模型 poll模型 epoll模型 udp组播模型 线

基本socket api

socket函数,为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,并且指定通信协议类型. #include<sys/socket.h> int socket (int family, int type, int protocol); //成功返回非负描述符,出错-1 其中family参数指明了协议族,AF_INET(IPv4), AF_INET6(IPv6):type参数指明套接字的类型,SOCK_STREAM(字节流) , SOCK_DGRAM(数据包). connet

Socket API概述

ACE Socket Wrapper Facade 1:Socket API 1.1 IPC(进程间通信) IPC分为本地IPC(同一计算机上的不同进程)和远程IPC(网络互联的不同计算机),本地IPC的机制有共享内存(shared memory).管道(pipe).信号(signal)等,远程IPC的机制有Socket.X25电路.WIN32命名管道(named pipe). 1.2 Socket API 应用程序可以用Socket API中的C函数创建.管理本地通信端点(endpoint),

Windows Socket API 使用经验

本文是我在进行MS-Windows.HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考.本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API. 一.WSAStartup函数    int WSAStartup(      WORD wVersionRequested,        LPWSADATA lpWSAData      );    使用Socket的程序在使用Socket之前必须调用WSAStartup函数.该函数的第一个参数指明

Socket编程实践(18) --Socket API 封装(1)

序言: 定义一套用于TCP通信比较实用/好用Socket类库(运用C++封装的思想,将socket API尽量封装的好用,实用); 思想来源:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html Socket.h #ifndef SOCKET_H_INCLUDED #define SOCKET_H_INCLUDED #include <sys/socket.h> #include <sys/types.h> #inc