UDP和TCP的对比
--UDP处理的细节比TCP少。
--UDP不能保证消息被传送到目的地。
--UDP不能保证数据包的传递顺序。
--TCP处理UDP不处理的细节。
--TCP是面向连接的协议
--UDP是无连接协议
--TCP保持一个连接
--UDP只是把数据发送出去而已
TCP的优点
--TCP提供以认可的方式显示的创建连接和终止连接。
--TCP保证可靠的,顺序的以及不会重复的数据传输。
--TCP处理流控制。
--TCP允许数据优先。
--如果数据没有传送到,TCP套接字会返回出错提示。
--TCP通过保持连接并将数据块分成更小的分片来处理大数据,而无需程序员编码处理。
TCP的缺点
--TCP需要创建并保持一个连接,给系统带来很大开销。
--TCP数据传输效率低。
并发机制
.增加server数量
.多层结构
一台server同事支持1000个client
中间件对于普通用户来讲是server,对于server是client,一个中间件同时支持1000个client
中间件会遍历自己管理的1000个client,发现client需要连接server,才会将请求发送给server,不需要连接server的client就不向server发送请求
多层结构的原理:利用不是client在同一时间内都需要向server发送请求,永远只有部分用户需要发送请求。
UDP的优点
--UDP不要求保持一个连接
--UDP没有因接收方没有收到数据包重传而带来开销。
--设计UDP目的是用于短应用和控制消息。
--在一个数据包接一个数据包基础上,UDP要求的网络带宽比TCP小。
UDP的缺点
--程序员必须创建代码监测数据包的正确性,必要时重传。
--程序员必须把大数据包分片。
选择使用哪一种协议?
--一些消息重要程度不高,或者有规律重复,可以使用UDP。
--如果要传输一个重要的数据,丢失一点就会破坏整个数据,那么需要选择TCP。
--telnet,ssh,http等基本都基于TCP。
--流媒体为了保证很窄的网络带宽来传送更多的数据,基本采用UDP。
多数游戏中,丢失来自某个用户的状态更新可能不会引起注意,所以采用UDP。
设计用在局域网的应用可以采用UDP,因为在局域网中丢失数据包的可能性很低。
使用UDP与TCP所用的代码基本类似,唯一的区别在于socket函数调用的时候的一个参数不同
int socket(int domain,int type,int protocol);
参数type为SOCK_STREAM代表TCP,SOCK_DGRAM代表UDP。
对于TCP和UDP都可以使用recvfrom函数,但recv只能TCP使用。
使用UDP发送数据。
ssize_t sendto(int s,const void *buf,size_t len,int flags,const struct sockaddr *to,socklen_t tolen);
参数s是指套接字描述符
参数buf是发送数据buf内存地址指针
参数len是发送数据的长度
参数flags一般传0
参数to是结构sockaddr的内存地址指针
参数tolen是结构sockaddr的大小
UDP不需要握手机制,也不需要确认另一个系统是否有服务端在listen。
成功返回发送的字节数,失败返回-1,并且设置errno
使用UDP接收数据
ssize_t recvfrom(int s,void * buf,size_t blen,int flags,struct sockaddr * from,socklen_t * fromlen);
成功返回接收字节数,失败返回-1,并且设置errno;UDP不同于TCP/IP,就算发送端关闭,recvfrom也不会返回0,因为UDP是无连接协议。
UDP不需要listen,bind之后就可以接受数据了。
recv函数只是从UDP缓存中读数据(此时数据已经在自己的电脑上了),不是直接从网络中读数据,什么时候UDP缓存区满了,另一边的send函数才会停止发送数据。
UDP发送广播消息
IP地址由四个字节组成,每个字节十进制是0时,表示本机,十进制是255就是广播消息,
例如:192.168..255这就是在 192.168..x这个局域网中广播消息
但是255.255.255.255并无法在全世界广播消息,因为路由器会屏蔽局域网中广播消息,不会传递到公网上。
代码如下
int on = ;
if (setsockopt(st, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) == -)
{
  printf("setsockopt failed ! error message :%s\n", strerror(errno));
  return -;
}
sendto和recvform
在UDP中,当UDP接收端,只要bind端口号,sendto发送的数据就会缓存到接收端的UDP缓存区中,如果缓存区已满,那么sendto函数便会报错(信息过长错误)。
将域名转化为IP地址
const char *getIPAddrbvHostname(const char *hostname)
{
static char s[]={};
struct hostent *h;
h=gethostbyname(hostname);
strcpy(s,inet_ntoa(*((struct in_addr *)h->h_addr)));
return s;
}
将struct sockaddr_in转化为IP地址
const char *getIPAddrbvaddr(struct sockaddr_in *client_addr)
{
return inet_ntoa(client_addr->sin_addr);
}
void sockaddr_toa(const struct sockaddr_in *addr,char *IPAddr)
{
unsigned char *p=(unsiged char *)&(addr->sin_addr.s_addr);
sprintf(IPAddr,"%u.%u.%u.%u",p[],p[],p[],p[]);
}
inet_ntoa()函数是一个线程不安全函数,这个函数返回的是字符串,
而参数并没有传递字符指针(不是当前函数分配内存),这说明这个函数返回的字符串一定不在线程的栈上,不在本线程的栈上,就有可能被其他线程修改,导致错误。
获取socket自身的sockaddr
int getsockname(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
获取socket连接的远端sockaddr
int getpeername(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

Linux 网络编程五(UDP协议)的更多相关文章

  1. Linux网络编程(五)

    /*Linux网络编程(五)——多路IO复用之select() 网络编程中,使用IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个 ...

  2. Linux网络编程:UDP Socket编程范例

    TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...

  3. 网络编程(UDP协议-聊天程序)

    网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...

  4. 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...

  5. JAVA基础知识之网络编程——-基于UDP协议的通信例子

    UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...

  6. UNIX网络编程——基于UDP协议的网络程序

    一.下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器: #include <sys/types.h> #include <sys/so ...

  7. java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket

    什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...

  8. Java学习笔记52(网络编程:UDP协议案例)

    InetAddress类: 表示互联网中的IP地址,示例: package demo; import java.net.InetAddress; import java.net.UnknownHost ...

  9. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...

随机推荐

  1. Python: 解决pip安装源被墙的问题

    pip install <package> -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.c ...

  2. Android开发--Apache服务器安装,解决Apache服务无法启动的问题

    昨天学习Android XML解析的时候,想在自己的电脑上搭建一个最简单的Web服务器来存放一段XML文本,然后在Android程序中解析,查找了一些资料后,看到Apache服务器比较容易上手,使用范 ...

  3. 解决虚拟机linux端mysql数据库无法远程访问

    解决虚拟机linux端mysql数据库无法远程访问 1. 在控制台执行 mysql -u root -p mysql,CentOS系统提示输入数据库root用户的密码,输入完成后即进入mysql控制台 ...

  4. 生命游戏/Game of Life的Java实现(转)

    首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死 ...

  5. OOD沉思录 --- 类和对象的关系 --- 包含关系2

    4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员) 这其实就是高内聚的翻版强调.如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念. ...

  6. 【体系结构】Oracle参数介绍

    [体系结构]Oracle参数介绍 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩ ...

  7. 《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项

    SQL Server允许用户设置数据库初始值和最大值,可以通过自动增长或者自动收缩进行配置.通过这些配置,我们可以防止数据库空间问题而导致的应用程序修改失败或者SQL Server磁盘空间耗尽的事情发 ...

  8. PHP递归创建多级目录(一道面试题的解题过程)

    今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkd ...

  9. C语言杂谈(二)自增运算符++与间接访问运算符*的结合关系和应用模式

    自增运算符++有前缀和后缀两种,在搭配间接访问运算符*时,因为顺序.括号和结合关系的影响,很容易让人产生误解,产生错误的结果,这篇文章来详细分析一下这几种运算符的不同搭配情况. ++.--和*的优先级 ...

  10. 虚拟机Linux----Ubuntu1204----退格键方向键无法使用

    修改 /etc/vim/vimrc.tiny,如下: set compatible #修改为 set nocompatible #控制方向键set backspace=2 #控制退格键