Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209436
  • 博文数量: 43
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 485
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-07 21:45
文章分类

全部博文(43)

文章存档

2011年(3)

2010年(1)

2009年(21)

2008年(18)

我的朋友

分类: C/C++

2008-10-14 18:08:04

1.TCP Client/Server模式的过程

服务器端首先通过socker()获取套接字文件描述符,然后用bind()绑定网络地址,调用listen()进行监听,accept()在客户段通过connect()连接时返回一个新的套接字文件描述符用于跟客户端通信。经过一系列read() write()通信后,调用close()关闭连接。


2.socket()函数
    #include
    int socket (int family, int type, int protocol);
    Returns: non-negative descriptor if OK, -1 on error
建立套接字,family, type和protocal的取值参考下面的表



参数的组合方式见下表:

最常用的就是第一和第二列组合。


3.connect()函数
    #include
    int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
    Returns: 0 if OK, -1 on error
sockfd是通过socket()创建的套接字描述符,servaddr是服务器地址指针,addrlen是地址数据结构的长度。connect()函数调用会通过“三次握手”创建TCP连接,具体过程如下:

TCP连接创建后就可以通过在套接字上调用read(),write(),像读写本地磁盘一样读取网络数据。


4.bind()函数
    #include
    int bind (int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
    Returns: 0 if OK,-1 on error
sockfd是通过socket()创建的套接字描述符,myaddr是本地地址指针,addrlen是地址数据结构的长度。bind()将本地地址绑定到套接字,地址包括IP地址和端口。
    地址必须是本地网络接口的地址或者通配地址(INADDR_ANY, in6addr_any),端口可以是0或则正整数,调用之后结果如下:


5.listen()函数
    #include
    #int listen (int sockfd, int backlog);
    Returns: 0 if OK, -1 on error
listen将sockfd套接字状态从ACTIVE装换到PASSIVE,这样内核就可以将连接请求转给这个socket。参数backlog是连接数的最大值,内核为每个socket建立两个队列incomplete connection queue, completed connection queue,前者是等待三次握手的连接队列,后者是已经完成三次握手还没有关闭的连接队列,backlog就是这两个队列总和的最大值。


6.accept()函数
    #include
    int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
    Returns: non-negative descriptor if OK, -1 on error
accept()接受来自客户端的连接请求,返回新的套接字描述符,并将客户端地址填充到cliaddr所指的内存中, addrlen设置地址长度。


7.close()函数
    #include
    int close (int sockfd);
    Returns: 0 if OK, -1 on error
close()关闭连接,关闭的套接字描述符不能再调用read(),write()进行读写。调用close()后TCP尝试将缓存中的数据发送出去。关闭TCP连接要进行四次握手,具体如下:



8.TCP状态转换图










阅读(1441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~