深度探索Linux内核之connect系统调用


 下面是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。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值