UDP浅析!!!(客户-服务通信源码)

UDP协议的特点:

1,无连接,也就是说:UDP内部并没有维护端到端的状态,这跟TCP是不一样的。UDP不需要三次握手,

2,基于消息的数据传输服务,传输的是数据报,跟TCP基于字节流是不一样的,不会出现所谓的粘包问题,就是这些

      数据报是有边界的,而TCP是没有边界的

3,不可靠,表现在数据报可能会丢失,也可能会重复,也可能会乱序,缺乏流量控制


所以说:一般情况下,UDP是比TCP更加高效的

有些场合更适合使用UDP,使用UDP编写的一些常见的应用程序有:DNS(域名系统),NFS(网络文件系统)和

SNMP(简单网络管理协议)


基本模型:

也是需要服务端和客户端的

服务端创建socket,bind,接下来调用recvfrom(因为不需要建立连接)一直阻塞,直到收到来自客户的数据

对于客户端而言:创建socket,接下来也是直接调用sendto函数给服务器发送数据报,其中必须指定目的地(即服务

器)的地址作为参数,这时recvfrom才会收到数据,并且对数据进行处理,recvfrom将与所接受的数据报一道返回客

户的协议地址,因此服务器可以把响应发送给正确的客户。服务器这时会调用sendto函数,然后返回,客户端调用

recvfrom接受,最后调用close函数


UDP的简单回射客户/服务器


当然,这里面需要用到recvfrom,sendto函数,我们来看看:

 #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t recv(int sockfd, void *buf, size_t len, int flags);

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

       ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

//第一个:套接字socket
//第二个:缓冲区
//第三个:接收的长度
//第四个:flags,我们用0来表示
//第五个,第六个:指定对方的地址信息



UDP服务端:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>

#define ERR_EXIT(m)\
	do\
	{\
		perror(m);\
		exit(EXIT_FAILURE);\
	}while(0)


void echo_srv(int sock)
{
	char recvbuf[1024] = {0};
	struct sockaddr_in peeraddr;
	socklen_t peerlen;
	int n;                      //接受到的字节数

	while(1)
	{
		peerlen = sizeof(peeraddr);
		memset(recvbuf, 0, sizeof(recvbuf));
		n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*)&peeraddr, &peerlen);
		
		if(n == -1)
		{
			if(errno ==
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值