Android NDK网络通信篇(五)之UDP通信篇

本文详细介绍了Android NDK中进行UDP通信的相关函数,包括创建、绑定UDP socket,发送、接收数据,以及获取客户端和服务端socket信息。提供了UDP服务端和客户端的完整示例代码,帮助读者深入理解UDP通信流程。
摘要由CSDN通过智能技术生成

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=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值