通过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通信的主要内容,如果未能解决你的问题,请参考以下文章

什么叫套接字。Socket?

TCP/UDP如何进行Socket通信

Socket 通信之 UDP 通信

Android 通过局域网udp广播自动建立socket连接

细说http - tcp - udp - socket - protobuf协议

第十一篇:socket编程