基本TCP套接字函数

来源:互联网 发布:微信点餐系统源码下载 编辑:程序博客网 时间:2024/05/16 09:39

                                    基本的TCP套接字编程函数

1.socket函数

    int socket(int family, int type, int protocol);

family指明协议族,type指明套接字的类型

    该函数只是指定了协议族(IPV4/IPV6/UNIX)和套接字类型(字节流、数据报或者原始套接字),就获得了与文件描述符类似的套接字描述符他是一个非负整数。

2.connect函数

    int connect(int sockfd, const struct sockaddr * servaddr, socklen_t addrlen);

    sockfd是由socket函数返回的套接字描述符,第二个、第三个参数分别是一个指向套接字地址结构的指针和该结构的大小。套接字地址结构必须含有服务器的IP地址和端口号。

    如果是TCP套接字则调用connect函数将激发三路握手,只有在连接建立成功或者失败时返回。

3.bind函数

    int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);

    bind函数把一个本地协议地址赋予一个套接字,协议地址是32位IPV4或者128位IPV6协议地址和16位TCP或者UDP端口号的组合。

    第二个参数是一个指向特定于协议的地址结构的指针,第三个参数是该地址结构的长度。对于TCP,调用bind函数可以指定一个端口号,或者指定一个IP地址,也可以两者都指定或者两者都不指定。

###服务器在启动时捆绑他们众所周知的端口,如果一个客户或者无服务没有调用bind捆绑一个端口,当调用connect或者listen时内核就要为相应的套接字选择一个临时端口。让内核来为客户选择临时端口是很正常的,除非需要用一个预留端口。让内核为一个服务器选择临时端口是很少见到的因为服务器是通过他们众所周知的端口而被大家认识的。

###进程可以把一个特定的IP地址捆绑到他的套接字上,不过这个IP地址必须是其所在主机的网络接口之一。对于TCP客户这就为在该套接字上发送的IP数据报指派了源IP地址,对于TCP服务器这就限定该套接字只接收那些目的地为这个IP地址的客户。TCP通常不把IP地址捆绑到他的套接字上,当连接套接字时内核根据所用外出网络接口来选择源IP地址。如果TCP服务器没有把IP地址捆绑到他的套接字上,内核就把客户发送的SYN的目的地址作为服务器的源IP地址。

进程指定IP地址和端口号

ip                        端口号                            结果

通配地址              0                                内核选择IP地址和端口号

通配地址             非0                             内核选择IP地址,进程指定端口号

本地IP地址          0                                进程指定IP地址,内核选择端口号

本地IP地址         非0                             进程指定IP地址和端口号

 

如果指定的端口号为0,则内核就在bind调用时选择一个临时端口。然而如果指定IP地址为通配地址则内核将等到套接字已连接上或者已在套接字上发出数据报时才选择一个本地IP地址。

4.listen函数

int listen(int sockfd,  int backlog);

当socket函数创建一个套接字时它默认为一个主动套接字,listen函数把一个未连接的套接字转换成一个被动套接字。本函数的第二个参数规定了内核应该为相应的套接字排队的最大连接个数。

内核为任何一个给定的监听套接字维护两个队列。一个是未完成连接队列(已由某个客户发出并到达服务器而服务器正在等待完成相应的TCP三路握手过程)

另一个是已完成连接队列(每个已完成三路握手过程的客户对应其中一项)。这两个队列之和不超过backlog.第一次握手的时候在未完成连接的队列中建立条目,第三次握手的时候将该条目从未完成队列转移到已完成队列。

5.accept函数

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

该函数用于从已完成队列队列头返回下一个已完成连接。函数的第一个参数是监听套接字返回值是一个新的全新描述符代表一个已连接套接字。区分这两个套接字相当重要,一个服务器通常只创建一个监听套接字,他在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字,当服务器完成对某个给定客户的服务时,相应的已连接套接字就关闭。

 

 

 

 

0 0
原创粉丝点击