通过socket来进行一个UDP通信
Posted 东东7_7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过socket来进行一个UDP通信相关的知识,希望对你有一定的参考价值。
前言
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议,一般用在广播等地方,因为他不在意对方是否收到
UDP:
客户端:先接收数据,先运行
1>创建一个socket套接字(调用socket函数,创建一个网络描述符)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
int socket(int domain, int type, int protocol);
//如果成功,返回一个可以使用的网络描述符,失败返回-1,并且设置errno的值
参数1:地址协议族
AF_UNIX //unix域
AF_INET //IPv4协议 32位整型数
AF_INET6 //IPv6协议 128位整型数
AF_UNIX/AF_LOCAL 表示单机进程程序
参数2:传输类型
SOCK_DGRAM //代表使用udp传输
SOCK_STREAM //代表使用tcp传输
SOCK_RAW //一般用于unix域传输
参数3:协议//特殊要求
protocol 应用层协议类型,0 表示自动匹配;
//例子:
int sfd = socket(AF_INET,SOCK_DGRAM,0);
2>绑定IP地址和端口号 192.168.1.10 8888
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//为指定的网络描述符绑定一个ip地址和端口号,成功返回0,失败返回-1,设置errno
参数1:网络描述符
参数2:ip地址结构体指针//原始结构体ip和port混合,使用不方便,所以不用
struct sockaddr_in
sa_family_t sin_family;//地址协议族,AF_INET
in_port_t sin_port;//端口号
struct in_addr sin_addr;//ip地址
;
/*ip地址结构体*/
struct in_addr
uint32_t s_addr;//ip变量
;
//例子:
struct sockaddr_in ip;
ip.sin_family = AF_INET;
ip.sin_port = htons(8888);
ip.sin_addr.s_addr = inet_addr(“192.168.1.10”);
//inet_pton(AF_INET,“0.0.0.0”,&ip.sin_addr.s_addr);
//如果地址填"0.0.0.0",则默认使用本机的ip地址
参数3:ip结构体长度
sizeof(ip)
通常我们在使用sockaddr_in 这个结构体的时候,我们需要对他进行类型转化
例子: bind (sfd,(void*)ip,sizeof(ip));
3、发送:sendto
ssize_t sendto(int sokfd, const void *buf, size_t len,
int flags, const struct sockaddr *dest_addr,
socklen_t addrlen);
功能:该函数可以从当前套接字中向目标主机发送数据;
参数:sockfd 套接字值,一般是socket()的返回值
buf 要发送的数据地址
len 要发送的数据长度
flags 发送方式,0 表示阻塞发送
dest_addr 要发送的目标地址结构体,不能为空;
addrlen 目标主机地址的长度。
返回值:成功 发送的数据长度
失败 -1;
例子:sendto(sfd,“hello”,6,0,&saddr,sizeof(saddr));
接收:recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:该函数将会在套接字上阻塞等待获取数据;
参数:sockfd 套接字id
buff 本地存储数据的地址
len 存储数据的长度
flags 获取数据的方式,0 阻塞
src_addr 数据中源主机的地址信息结构体,如果不关心发送端
用NULL表示;
addrlen 地址长度的指针
返回值:成功 获取数据的长度
失败 -1;
4>关闭网络描述符
close(sfd);
服务器:先发送数据,后运行
1>创建一个socket套接字(调用socket函数,创建一个网络描述符)
2>绑定IP地址和端口号(可以省略绑定) 192.168.1.10 8888
3>收发数据
4>关闭网络描述符
以上是关于通过socket来进行一个UDP通信的主要内容,如果未能解决你的问题,请参考以下文章
Android 通过局域网udp广播自动建立socket连接