UDP点滴

news/2024/5/17 19:18:52 标签: socket, 服务器, solaris, tcp, null, sun

1、UDP(user datagramprotocol):用户数据包协议,是一个传输层协议。

2、UDP是无连接的。UDP的客户端和服务器没有固定的绑定关系。言下之意,同一个UDP 客户端 socket可以向多个不同UDP服务器socket发包,同一个UDP服务器socket可以接收来自多个不同UDP客户端socket的数据包。

3、UDP是一个不可靠的传输层协议,没有丢包重传机制。

4、UDP的每一个数据包,都是有包边界的,不像TCP是面向字节流的协议。

5、未连接UDP socket不能收到“端口不可达之类的icmp消息”

6、UDP socket也可以调用connect函数。对于UDPsocket来说,调用connect并不会有类似TCP一样的“三次握手”机制,仅仅是绑定“目的IP地址,目的端口号”。关键点:UDP socket的connect,不会向对端发送任何数据包!!!!!!!

7、已连接的UDP socket,发包的时候,可以用send,sendto。对于sendto,目的地址指针参数必须为NULL,目的地址长度参数必须是0。

8、已连接的UDP socket,接收数据包的时候,可以用recv,recvfrom。对于recvfrom,源地址指针参数必须为NULL,源地址长度参数必须是0。

9、已连接的UDP socket可以接收到类似“端口不可达,之类的icmp消息”

10、已连接的UDP socket只能收,“源IP地址和源端口号”与“绑定的IP地址和端口号”相匹配的数据包。例如,客户端UDP socket 调用了connect连接了服务端UDP socket,那么客户端只能收到数据包的“源IP地址、源端口号”与“调用connect绑定的IP地址、端口号”匹配的数据包。

11、对于已连接的UDP socket,在以下两种情况下,可以继续调用connect函数

1)绑定一个新的“目的端口号和IP”

2)取消已有的连接。可以通过把socket 地址结构的sin_family字段值设为AF_UNSPEC

12、对于已连接的UDP socket,只有在调用send或者sendto发送第一个数据包的时候,才能收到“类似icmp端口不可达的错误”。因为,UDP connect的时候,不会有发包行为。

13、对于UDP socket,调用connect,内核会同时绑定本地的ip地址和端口号。(注意,sun solaris不支持)

14、UDP可以支持“单播、广播、组播”,TCP只能支持“单播”

15、调用UDP的recvmsg函数,可以得到辅助数据。例如,数据包的目的IP,目的端口。

16、当调用UDP的recvfrom函数的时候,如果接收的数据包大小超过了接收数据缓冲的大小,那么多余的数据就会被内核丢弃。并且,设置MSG_TRUNC标志。


http://www.niftyadmin.cn/n/1870174.html

相关文章

c/c++中的lvaues(左值)和rvalues(右值)

1.1 写在开头 也许有朋友看到这个介绍,会一笑而过。认为,Lvaues不就是,出现在赋值运算符“”左边的表达式么,相应的rvalues不就是出现在赋值运算符“”右边的部分么,这有啥难的呢? hand一下&#…

使用ThreadLocal请务必remove

场景说明:压测的时候发现调用某个接口同一个入参,返回的商品数据不一致。 使用技术:threadLocal 问题原因:使用ThreadLocal没有remove。 导致问题:1内存溢出,ThreadLocal依赖没有释放,无法GC。 2线程池的某…

Linux修改进程名称(setproctitle())

1.1 介绍 每一个c程序都有个main函数,作为程序启动入口函数。main函数的原型是int main(int argc , char *argv[]);其中argc表示命令行参数的个数;argv是一个指针数组,保存所有命令行字符串。Linux进程名称是通过命令行参数argv[0]来表示…

Spring事务篇

写在最前 这些天看了一些关于Spring事务的文章,发现写的都很浅,基本上说一下事务特性和Spring事务传播行为就完事了,但是实际上事务不仅有这些,事务的来龙去脉没有讲清楚,具体原理也没有说。 现在最新Spring版本已经…

gcc –finstrument-functions特性的应用

1 gcc –finstrument-functions特性的应用 这几天看了一下nginx的源码,分析过程中发现nginx模块加载、初始化这部分利用了函数指针的方式挂在的,通过阅读源码的方式寻找函数调用关系比较吃力。所以想起了通过gcc的–finstrument-functions特性&…

阿里云服务器 通过JavaMail发送邮箱STMP问题( 25端口被禁用 使用SSL协议465端口

我们传统使用的比较简单的是 STMP 25端口收发邮件 今天发现刚购买的阿里云服务器不能作为客户端通过STMP 25端口发送邮件 开始在网上有说发现是JDK1.8的原因,然后自己也把JDK1.8换到了JDK1.7 还是不行,所以这里排除了JDK的原因。 那么问题来了&#x…

linux access()函数和readdir()函数

1 linux access()函数和readdir()函数 1.1 access() access函数的原型如下: int access(const char *pathname, int mode); 此函数是用来获得调用进程对pathname所指向的文件(regular)或者是目录(directory)的访问权限。 pathname: 文件或者是…

对于 std::vectorT , 当T没有赋值运算符函数的时候,如何调用vector push_back?

这个问题是在stackoverflow发现的&#xff1a; http://stackoverflow.com/questions/12908398/can-placement-new-and-vectordata-be-used-to-replace-elements-in-a-vector 我是对讨论做一个整理&#xff0c;如下。 1.代码片段 #include <iostream> 2 #include <…