现在的位置: 首页 > 综合 > 正文

connect系统调用

2013年04月09日 ⁄ 综合 ⁄ 共 1042字 ⁄ 字号 评论关闭

转自: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。

抱歉!评论已关闭.