发布时间:2012-12-21 16:31:02
说起套接字的通讯,我们一般会想到C/S结构(客户端/服务端结构),从应用的角度来讲,确实如此,比如IM(即时通讯)服务,一台IM服务器同时与几 万的IM客户端进行着UDP数据报的通讯。但我们从套接字的编程实现,以及TCP/IP协议栈的实现原理这一层上来看,并不存在着服务端与客户端的明显区 别。 网络上的两台主机(为简化起见,我们假设它们处于同一子网内,并能互相连通),为了建立一个UDP的通讯,一端A必须事先知道另一端B的端口(B有一个进 程可以接受UDP数据报)。即B必须先建立一个套接字,并自己为其选择一个固定的端口号,而不是让系统自动......【阅读全文】
发布时间:2012-12-21 16:30:15
现在我们换一个角度,站在服务器的一方,看看如何被动地接收一个UDP数据,并作出相应的处理。我们把前面文章提及的UDP示例客户端放到 172.16.48.1上,在主机172.16.48.2的eth0网络设备接口上再配一个从属IP地址172.16.48.13。让客户端向13发送 UDP数据报。 函数myudp_rcv处理接收到的UDP数据报,该函数首先从数据报头中取出源和目的地址、端口。向哈希表myudp_hash查询,看是否存在相应的 sokcet等待处理该数据报。如果没有,则发生错误,即对端主机向本机的某个特定端口发送了一个UDP数据,但本机并没有......【阅读全文】
发布时间:2012-12-21 16:29:29
接着前一篇,我们来看这个应用程序背后,内核真正做了一些什么事情。 代表MY_INET域套接字的结构体struct inet_sock有一个成员recverr,它占1bit长度,可能的取值是1或0,当为0时表示socket上出错时,只通过系统调用向应用程序返回 错误号,不提供进一步的详细信息。当取值为1时,则表示socket上出错时,则向struct inet_sock的成员sk_error_queue(一个sk_buff的队列)存入一个特殊的struct sk_buff,在sk_buff的成员cb中放入详细......【阅读全文】
发布时间:2012-12-21 16:28:28
在前一篇中,我们提到在对端主机上没有创建指定的UDP套接字时,我们向其发送一个UDP包,会得到一个目的端口不可达的ICMP出错报文。但内核在处 理完该报文后,给应用程序仅仅返回一个ECONNREFUSED错误号,所以应用程序能知道的全部信息就是连接被拒绝,至于为什么被拒绝,没有办法知道。 我们可以通过套接字选项的设置,让内核返回更为详细的出错信息,以利于调试程序,发现问题。下面是通过套接字选项传递扩展出错信息的一个示例程序。关于内 核原理的分析,在下一篇给出。#include <sys/socket.h>#include <linux/types.h>......【阅读全文】
发布时间:2012-12-21 16:27:40
标题看起来有点别扭,但的确如此,在我们前面的例子中,我们并没有在对端主机172.16.48.1的16000端口上创建一个UDP套接字(简单地讲就 是没有开启UDP服务器),所以,我们不能期望向这个目的地址发送一个UDP数据报后会收到一个相应的UDP回应。但是,这并不表示我们发出去的数据报石 沉大海,对端主机的TCP/IP协议栈在检查了16000的端口并没有相应的进程需要接收UDP数据后,会回应一个ICMP包,告诉发送端,目的地址不可 达,具体原因是目的端口不可达。下面是在网络中截获的这个ICMP包: 16进制表示的数据包内容 ......【阅读全文】