百度空间 | 百度首页 
 
文章列表
 
您正在查看 "udp协议" 分类下的文章

2007年04月19日 星期四 下午 02:27

     在Socket编程中,发送数据报文可供使用的API函数有send,sendto和sendmsg,下面是关于前两个系统调用的原型:
#include <sys/socket.h>
ssize_t send( int socket, const void *buffer, size_t length, int flags );
     请注意它的返回值的类型ssize_t,其含义是signed size。从内核代码中,我们可以看到,在32位系统上,它是int,在64位系统上,它是long。它常用于表示在某一次操作后,缓冲区中可以被读或写的字节数量。相对应的,还有一个数据类型size_t

类别:udp协议 | 评论(4) | 浏览()
 
2007年04月17日 星期二 下午 06:38
     下面是connect系统调用的函数原型:
     #include <sys/types.h>
     #include <sys/socket.h>
     int connect( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen );
     man手册里面这样描述该系统调用:connect()系统调用把由文件描述符sockfd所代表的套接字连接到serv_addr所指定的地址上,参数addrlen用于标明serv_addr的大小。如果sockfd是SOCK_DGRAM类型的套接字
类别:udp协议 | 评论(9) | 浏览()
 
2007年03月14日 星期三 上午 08:22

        当建立一个UDP的socket用于网络通讯时,我们需要先为这个socket绑定一个本地端口号。因为端口在一台主机上是用于标识进程的,如果没有端口号,当收到来自对端主机的报文时,就不知道应该由哪一个进程来接收这个报文。但有时,我们建立UDP的sokcet以后,并不调用bind进行端口绑定,也能正常工作。这是因为协议栈对于没有进行端口绑定的socket进行了自动绑定。
        在SOCK_DGRAM类型的套接字的操作函数集的sendmsg成员函数中,每次调用对

类别:udp协议 | 评论(1) | 浏览()
 
2006年08月11日 星期五 下午 02:47
    UDP是一个简单的面向数据报的运输层协议,我们先站在UDP客户端的角度来看看如何发送一个UDP数据报,以及协议栈为发送一个UDP数据报做了哪些事情。
    UDP数据报可以在未连接的socket上发送(使用sendto系统调用,指定目的地址),也可以在已连接的socket上发送(使用send系统调用,不用指定目的地址),下面我们分两种情况讨论。
    下面是一个在未连接的socket上发送UDP数据的用户态程序示例(注:该程序的格式和风格相当不好,只是为临时测试使用。),该程序目前还只管发送,不处理接收,关于接收,我们后面再作分析:
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include "my_inet.h"
    #include <stdio.h>
    #include <errno.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    int main()
 
类别:udp协议 | 评论(0) | 浏览()
 
2006年07月19日 星期三 上午 07:35
    说起套接字的通讯,我们一般会想到C/S结构(客户端/服务端结构),从应用的角度来讲,确实如此,比如IM(即时通讯)服务,一台IM服务器同时与几万的IM客户端进行着UDP数据报的通讯。但我们从套接字的编程实现,以及TCP/IP协议栈的实现原理这一层上来看,并不存在着服务端与客户端的明显区别。
    网络上的两台主机(为简化起见,我们假设它们处于同一子网内,并能互相连通),为了建立一个UDP的通讯,一端A必须事先知道另一端B的端口(B有一个进程可以接受UDP数据报)。即B必须先建立一个套接字,并自己为其选择一个固定的端口号,而不是让系统自动选择,并把这个端口号告知A(通过人,或者是熟知端口)。然后A就可以通过connect系统调用,在其socket上设置好相应参数,以后每个发出的数据包的UDP首部中总标明目的地址B和其相应的端口号;或者每发一个数据报,通过sendto传入B的地址和端口号,以确保每个发出的数据报在B端被正确的进程接收。
    而A端可以自己选择一个固定的端口号,也可以由系统自动选择,这并不重要。因为B端收到来自A端的第一个数据报后,可以从UDP首部中判断A端的端口号,并在回应包中进行正确
类别:udp协议 | 评论(0) | 浏览()
 
2006年07月16日 星期日 下午 02:09
    现在我们换一个角度,站在服务器的一方,看看如何被动地接收一个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数据,但本机并没有该端口标识的进程需要处理该数据报,所以,这是一个目的端口不可达错误。调用myicmp_send发送一个目的端口不可达出错报文。
    目的端口不可达ICMP报文需要将整个源出错UDP报文作为数据负载(payload)放进报文中,所以,首先要对源UDP报文进行基本的正确性检查。还需要生成一份详细的ICMP参数信息,用于生成ICMP报文,ICMP参数信息用结构体struct icmp_bxm表示,下面是该结构体的定义:
    struct icmp_bxm {
        struct sk_buff *skb;
类别:udp协议 | 评论(0) | 浏览()
 
2006年07月14日 星期五 下午 11:22
    很多介绍网络编程的书籍中会这样介绍connect系统调用:将本机的一个指定的套接字连接到一个指定地址的服务器套接字上去。下面是connect系统调用的定义:
        int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
    参数sockfd是本地机器上的一个套接字描述符,在内核的系统调用函数中该描述符会被转换成与之绑定的一个struct socket结构,这是真正的一个socket,代表了网络通讯中连接的一端。serv_addr和addrlen则是要连接的服务器的地址和地址长度。
    于是乎,有了这样的理解:connect将在本机和指定服务器间建立一个连接。但实际上,connect操作并不引发网络设备传送任何的数据到对端。它所做的操作只是通过路由规则和路由表等一些信息,在struct socket结构中填入一些有关对端服务器的信息。这样,以后向对端发送数据报时,就不需要每次进行路由查询等操作以确定对端地址信息和本地发送接口,应用程序也就不需要每次传入对端地址信息(可以使用send而不使用sendto)。基于这样的理解,我们就不难弄明白,为什么不只是tcp socke
类别:udp协议 | 评论(0) | 浏览()
 
2006年07月14日 星期五 下午 09:13
    UDP是一个简单的面向数据报的传输层协议,我们先站在UDP客户端的角度来看看如何发送一个UDP数据报,以及协议栈为发送一个UDP数据报做了哪些事情。
    UDP数据报可以在未连接的socket上发送(使用sendto系统调用,指定目的地址),也可以在已连接的socket上发送(使用send系统调用,不用指定目的地址),下面我们分两种情况讨论。
    下面是一个在未连接的socket上发送UDP数据的用户态程序示例(注:该程序的格式和风格相当不好,只是为临时测试使用。),该程序目前还只管发送,不处理接收,关于接收,我们后面再作分析:
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include "my_inet.h"
    #include <stdio.h>
    #include <errno.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    int main()
 
类别:udp协议 | 评论(4) | 浏览()
 
     
 
 
文章存档
 
 
 
 
 
 
 
 
 
 
 
 
     
 
最新文章评论
   
 

我想请问:最大报文段长度(MSS)是最大的数据发送长度还是最大的数据接收长度?在书...
 

非常感谢!
 

不错不错,牛人啊
 

真棒...
 
     


©2009 Baidu