ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

CSAPP:第十一章 网络编程

2019-02-13 21:43:08  阅读:318  来源: 互联网

标签:addr CSAPP 函数 第十一章 编程 服务器 接字 include 客户端


CSAPP:第十一章 网络编程

11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口

11.1 客户端服务器模型

  每个网络应用都是基于客户端-服务器模型。采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。
  客户端-服务器模型的基本操作是事务。一个客户端-服务器事务由以下四步组成。

  • 当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
  • 服务器收到请求后,解释它,并以适当的方式操作它的资源。
  • 服务器给客户端发送一个响应,并等待下一个请求。
  • 客户端收到响应并处理它。

11.2 全球IP因特网

  客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
  全球IP因特网是最著名和最成功的互联网网络实现。每台因特网主机都运行实现TCP/IP协议的软件,几乎每个现代计算机系统都支持这个协议。因特网的客户端和服务器混合使用套接字接口函数和unix I/O函数来进行通信。

11.3 套接字接口

  套接字接口是一组函数,它们和Unix I/O函数结合起来,用以创建网络应用。


11.3.1 套接字的地址结构
  因特网的套接字地址存放在类型sockaddr_in的16字节结构中。对于因特网的应用,sin_family成员是AF_INET,sin_port成员是一个16位的端口号,sin_addr成员就是一个32位IP地址。IP地址和端口号总是以网络字序(大端模式)存放的。

 

 1/* IP socket address structure */
2struct sockaddr_in {
3    uint16_t       sin_family;     /* Protocol family (always AF_INET)*/
4    uint16_t       sin_port;       /* Port number in network byte order */
5    struct in_addr sin_addr;       /* IP address in network byte order */
6    unsigned char  sin_zero[8];    /* Pad to sizeof(struct sockaddr) */
7};
8
9/* Generic socket address structure for(connect,bind and accept)*/
10struct sockaddr{
11    uint16_t sa_family;   /* Protocol family */
12    char     sa_data[14]; /* address data */
13};

11.3.2 socket函数
  客户端和服务器使用socket函数来创建一个套接字描述符。

1#include <sys/types.h>          /* See NOTES */
2#include <sys/socket.h>
3
4int socket(int domain, int type, int protocol);//若成功,返回套接字描述符;失败返回-1

11.3.3 connect函数
  客户端通过调用connect函数来建立和服务器的连接。connect函数试图与套接字地址为addr的服务器建立一个因特网连接,其中addrlen是sizeof(sockaddr_in)。connect函数会阻塞,一直到连接成功建立或者发生错误。

1#include <sys/types.h>          /* See NOTES */
2#include <sys/socket.h>
3
4int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

11.3.4 bind函数
  剩下的套接字函数--bind,listen和accept,服务器用它们来和客户端建立连接。

1#include <sys/types.h>          /* See NOTES */
2#include <sys/socket.h>
3
4int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

  bind函数告诉内核 addr中的服务器套接字地址和套接字描述符sockfd联系起来
11.3.5 listen函数
  客户端是发生连接请求的主动实体。服务器是等待客户端的连接请求的被动实体。默认情况下,内核会认为socket函数创建的描述符对应于主动套接字,它存在于一个连接的客户端。服务器调用listen函数告诉内核,描述符是被服务器使用而不是客户端。

1#include <sys/types.h>          /* See NOTES */
2#include <sys/socket.h>
3
4int listen(int sockfd, int backlog);

  listen函数将sockfd从一个主动套接字转化为一个监听套接字,该套接字可以接受来自客户端的连接请求.backlog参数暗示了内核在开始拒绝连接请求前,队列中要排队的未完成的连接请求的数量。
11.3.6 accept函数
  服务器通过调用accept函数来等待来自客户端的连接请求。

1#include <sys/types.h>          /* See NOTES */
2#include <sys/socket.h>
3
4int accept(int listenfd, struct sockaddr *addr, socklen_t *addrlen);

  accept函数等待来自客户端的连接请求到达侦听描述符listenfd,然后在addr中填写客户端的套接字地址,并返回一个已连接描述符,这个描述符可以被用来利用Unix I/O函数与客户端通信。

标签:addr,CSAPP,函数,第十一章,编程,服务器,接字,include,客户端
来源: https://www.cnblogs.com/ywx123/p/10371897.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有