深度探索Linux内核之connect系统调用
2011-12-28 11:14
471 查看
出自: http://hi.baidu.com/linux_kernel/blog/item/ba9c32fad482fe1fa8d311d7.html 下面是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类型的套接字,那么serv_addr就是数据报文缺省传向的那个地址,同时,只有来自该地址的数据报文才能被 该socket接收到。如果socket的类型是SOCK_STREAM或者SOCK_SEQPACKET,那么这个调用将试图同绑定在地址serv_addr的socket建立一个连接。一般来讲,面向连接协议的socket只可能一次成功调用connect,而无连接协议的socket可以多次使用connect改变它们的连接关系,同时,无连接协议的socket可以通过设置serv_addr的成员sa_family为AF_UNSPEC来解除已有的连接。 在TCP/IP的源代码实现中,SOCK_DGRAM套接字类型的connect函数是inet_dgram_connect。该函数首先检查connect系统调用的serv_addr参数,如果它的sa_family成员的值是AF_UNSPEC,则表示解除该socket已有的连接,直接调用具体协议的disconnect函数,UDP协议的disconnect函数是udp_disconnect,该函数所要做的工作主要是重置struct inet_sock(表示是INET域的socket)的几个成员,sk_state置TCP_CLOSE;daddr,dport置0,以清目的地址和端口;sk_bound_dev_if清零,表示清输入网络设备接口;然后选择性地清源地址和源端口。然后清目的入口(struct dst_entry)。否则,在判定本地端口已被绑定之后,执行协议的connect函数,udp协议的connect函数是ip4_datagram_connect。 |
相关文章推荐
- linux 3.12内核里系统调用常见的问题
- linux内核文件IO的系统调用实现分析(open)
- 修改Linux内核增加系统调用
- linux内核之系统调用nanosleep与pause()
- linux内核不用系统调用获取时间的函数kernel_mktime
- Ubuntu 14.04 内核版本Linux 3.13 添加系统调用
- 深入理解Linux内核-系统调用
- 在内核linux-3.1-rc4中加入系统调用 (32位和64位)
- Linux内核设计基础(七)之系统调用
- linux内核中断、异常、系统调用的分析以及实践
- Linux系统调用内核态分析
- mips处理器linux内核添加系统调用
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- akira之修改linux 3.6.8内核并添加系统调用
- linux-3.5.4内核添加新的系统调用并测试
- 深度探索Linux内核之自动分配UDP本地端口
- linux文件系统之open系统调用(基于3.4.9内核)
- 深度探索linux操作系统系统构建和原理解析第三章
- 内核版本升级和添加Linux系统调用
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink