UDP 套接字是无连接协议,必须使用 sendto 函数发送数据,必须使用 recvfrom 函数接收数据,发送时需指明目的地址。sendto 函数与 send 功能基本相同, recvfrom 与 recv 功能基本相同,只不过 sendto 函数和 recvfrom 函数参数中都带有对方地址信息,这两个函数是专门为 UDP 协议提供的。
sendto 函数原型sendto() 用来将数据由指定的 socket 传给对方主机. 参数s 为已建好连线的 socket , 如果利用 UDP 协议则不需经过连线操作. 参数 msg 指向欲连线的数据内容, 参数 flags 一般设 0 , 详细描述请参考 send(). 参数 to 用来指定欲传送的网络怎么吐烟圈地址, 结构sockaddr 请参考 bind(). 参数 tolen 为 sockaddr 的结果长度.
错误代码:EBADF :参数s 非法的socket 处理代码.EFAULT: 参数中有一醒酒的最快方法指针指向无法存取的内存空间.WN摩梭人OTSOCK :cans二次工业革命hu s 为一文件描述词, 非socket.EINTR冥婚电影: 被信号所中断.EAGAIN: 此动作会令进程阻断, 但参数s 的soket 为补课阻断的.ENOBUFS: 系统的缓冲内存不足.EINVAL: 传给系统调用的参数不正确.recvfrom 函数错误代码: WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。 WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。 WSAEFAULT:fromlen参数非法;from缓冲区大小无法装入端地址。 WSAEINTR:阻塞进程被WSACancelBlockingCall()取消。 WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。 WSAEINVAL:套接口未用bind()进行捆绑赵烈文。 WSAENOTCONN:套接口未连接(仅适用于SOCK_STREAM类型)。 WSAENOTSOCK:描述字不是一个套接口。 WSAEOPNOTSUPP:指定了MSG_OOB,但套接口不是SOCK_STREAM类型的。 WSAESHUTDOWN:套接口已被关闭。当一个套接口以0或2的how参数调用shutdown()关闭后,无法再扁平足用recv()接收数据。 WSAEWOULDBLOCK:套接口标识为非阻塞模式,但接收操作会产生阻塞。 WSAEMSG怎样开公司SIZE:数据报太大无法全部装入缓冲区,故被剪切。 WSAECONNABORTED:由于超时或其他原因,虚电路失效。 WSAECONNRESET:远端强制中止了虚电路。 一. UDP 客户服务器程序的套接字模型二、函数解析#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buf, size_t nbytes,int flags, struct sockaddr *from, sockle赌城n_t *addrlen);ssize_t401 se货运人ndto(int sockfd, const void *buf, 小米理财size_t nsize, int flags, const struct sockaddr *to, const socklen_t *addrlen);若成功,均返回读或者写的字节数;失败则返回-1函数的细节要点分析:
recvfrom 和 sendto 的前三个参数与 recv 和 send 一模一样。recv 中参数 from,addrlen 都是值-结果参数,from 指针指向数据发报者的协议地址的套接字地址结构,而 addrlen 指针则指向地址结构的字节数返回给调用者(与accept函数的最后俩个参数相似, 返回给调用者,处理完请求后,调用sendto函数)。在 recvfrom 函数中如果不在乎数据发报者的地址,可必须同时设置 from 和 addrlen 参数为 NULL。在 UDP 协议中返回长度为0 的数据是可行的。因为在UDP的情况下,他会形成 20 字节的 ip首部(IPv4)和一个 8 字节的 UDP 首部而没有数据的 IP 数据报。所以 UDP 是无连接。 sendto 和 recvfrom 在 tcp 函数中也是通用的。三、sendto 与 recvfrom 缓冲分析send 和 sendto 函数在 UDP 层没有输出缓冲区,在 TCP 层有输出缓冲区,recv 和recvfrom 无论在 UDP 层还是 TCP 层都有接收缓冲区。这样看来 sendto 应该是不会阻塞的。
UDP 发朴树老婆送缓冲区和接收缓冲区细节分析:这一次我婴幼儿游泳们展示的套接口发送缓冲区利益最大化用虚框表示,因为它并长江洪水不存在。UDP 套接口有发送缓冲区大小(SO_SNDBUF修改),不过它仅仅是出风口香水写到套接口的 UDP 数据报的大小上限。 如果应用程序写一个大于套接口发送缓冲区大小的数据报,内核将返回一个 EMSGSIZE 错误。 耐万古霉素肠球菌既然 UDP 不可靠,他不必保存应用进程的数据拷贝,因此无需真正的发送缓冲区(应用进程的数据在沿协议栈往下传递,以某种形式拷贝到内核缓冲区,然而数据链路层在送出数据之后将丢弃该拷贝)
UDP 没有 MSS(最大分节大小)的概念,如果某个 UDP 应用程序发送大数据,那么他比 TCP 应用程序更容易分片。从 UDP 套接口 write 成功返回仅仅表示用户写入的数据报或者所有片段已经加入到数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或者他的某个片段,内核 通常返回给应用进程一个 ENOBUFS 错误(也有的系统不会返回错误)。
TCP 和 UDP 都拥有套接口接收缓冲区。TCP 套接口接收缓冲区不可能鸦片战争的影响溢出,因为 TCP 具有流量控制(窗口).然而对于 TCP 来说, 当接收到的数据报装不进套接口接收缓冲区时,该数据报就丢弃 。 UDP 是没有流量控制的:较快的发送端可以很容易淹没较慢的接收端,导致接收端的 UDP 丢弃数据报。
C/C++Linux服务器开发/高级架构师 系统学习教程欢迎朋友们加入学习交流群:960994558 群内提供一些 C/C++Linux服务器开发/高级架构师 的学习资料、教学视频 包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,R看手相图解edis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等 学习资料资料本文发布于:2023-06-04 07:36:23,感谢您对本站的认可!
本文链接:http://www.ranqi119.com/ge/85/214537.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |