Android NDK网络通信篇(五)
UDP通信篇
前言
本篇重点讲解UDP通信的相关函数以及UDP服务端和客户端程序设计流程,并提供UDP C/S通信的客户端和服务端示例代码。
UDP通信相关的头文件
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/endian.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
UDP通信函数解析
创建UDP socket
int socket(int domain, int type, int protocal);
参数解析:
domain:指定将会产生通讯的socket域,并且选择用到的协议族。android平台目前支持以下协议族:
l PF_LOCAL:主机内部通讯协议族,该协议族使用物理上运行在同一台设备上的应用程序可以使用Socket APIs进行通信。
l PF_INET:IPv4协议族,该协议族使得运行的应用程序可以与网络上的其它应用程序进行通讯。
type:指通信的类型,支持以下两种类型:
SOCK_STREAM:供TCP协议使用。
SOCK_DGRAM:供UDP协议使用。
protocal:指定将会用到的协议。对于大部分协议族和协议类型来说,只能使用一个协议。为了选择默认的协议,该参数可以设为零。
如果socket创建成功,将会返回对应的socket描述符,否则返回-1。
示例代码:
int NewUdpSocket(JNIEnv *env,jobject obj){
int sd=socket(PF_INET,SOCK_DGRAM,0);
return sd;
}
绑定UDP socket
int bind(int socketDescriptor, const struct sockaddr* address, int addressLength);
参数解析:
socketDescriptor:指服务端socket
address:指socket要绑定的服务端地址结构体
addressLength:指定address结构体的大小
如果绑定成功,返回0,否则返回-1
示例代码:
sockaddr_in getSockaddr_in(const char *ip,int port){ sockaddr_in address; memset(&address,0, sizeof(sockaddr_in)); address.sin_family=AF_INET; address.sin_port=htons(port); inet_aton(ip,&address.sin_addr); return address; }
int BindSocket(JNIEnv *env,jobject obj,int sd,const char *ip,int port){ sockaddr_in address=getSockaddr_in(ip,port); int result=bind(sd,(sockaddr *)&address, sizeof(address)); return result; }
接收UDP信息
ssize_t recvfrom(int socketDescriptor, void* buffer, size_t bufferLength, int flags, const struct sockaddr* address, socklen_t* addressLength);
参数解析:
socketDescriptor:指要接收信息的socket,在客户端指服务端socket,在客户端指客户端socket
buffer:指接收数据的缓冲区
bufferLength:指接收数据的缓冲区的大小
flags:指要接收数据的附加参数
address:指sockaddr结构体,这个结构体将被填入接收方的信息
addressLength:address结构体的大小
如果函数调用成功返回接收到的数据的大小,否则返回-1
示例代码:
int server_socket= NewUdpSocket(env,gThiz);
sockaddr_in address;
socklen_t addr_len=