• 2018-2019-1 20165303 《信息安全系统设计基础》第八周学习总结


    网络编程

    • 客户端-服务器编程模型
      一个应用是由一个服务器进程和一个或者多个客户端进程组成
      服务器进程管理某种资源 ,并且通过操作这种资源来为它的客户端提供某种服务
    • 网络
    • 一个网络主机的硬件组成

    从网络上接收到的数据从适配器经过I/O和存储器总线复制到存储器,通常是通过DMA(直接存储器存取方式)传送。
    网络是一个按照地理远近组成的层次系统:最低层是LAN(局域网),最流行的局域网技术是以太网。

    • 桥接以太网

    • 套接字接口
      1.socket()函数
      该函数用于根据指定的地址族、数据类型和协议来分配一个套接字的描述字及其所用的资源。Socket函数原型为:
      int socket( int domain , int type , int protocol ) ;
      a、 参数domain指定地址描述,一般为AP_INET;
      b、 参数type指定socket类型:SOCK_STREAM和SOCK_DGRAM;
      c、参数protocol通常为0;
      d、 函数返回值为一个整型socket描述符,在bind函数中调用。
      2.bind()函数
      该函数用于将一个本地地址与一个套接字绑定在一起。
      int bind( int sockfd , struct sockadd* my_addr , int addrlen) ;
      a、sockfd:socket描述符,使用socket函数返回值,将该socket与本机上的一个端口相关联。
      在设计服务器端程序是需要调用bind函数,以在该端口上监听服务请求;而客户端一般不需要调用bind函数,因为只需知道服务器IP地址,并不关心客户通过哪个端口与服务器建立连接,内核会自动选择一个未被占用的端口供客户端来使用。
      b、my_addr:指向包含本机IP地址及端口号等信息的sockaddr类型的指针。
      c、addrlen:sizeof( struct sockaddr)的值。
      d、bind函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码。
      3.connect()函数
      与远程服务器建立一个TCP连接。
      int connect(int sockfd, struct sockaddr* serv_addr, int addrlen);
      a、sockfd:目的服务器的socket描述符。
      b、serv_addr:指向包含目的服务器的IP地址及端口号的指针。
      c、addrlen:sizeof( struct sockaddr)的值。
      d、connect函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,进行服务器端程序设计时不需调用connect函数。
      4.listen()函数
      在服务器端程序中,当socket与某一端口绑定后,需要监听该端口,及时处理到达该端口上的服务请求。
      int listen(int sockfd, int backlog);
      a、sockfd:Socket系统调用返回的socket描述符。
      b、backlog:指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待接收backlog限制了队列中等待服务的请求数目,系统缺省值为20。
      c、listen函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码。
      5.accept()函数
      当某个客户端试图与服务器监听的端口连接时,该连接请求将排队等待服务器用accept接收它并为其建立一个连接。
      int accept(int sockfd, struct sockaddr* addr, int* addrlen);
      a、sockfd:被监听的socket描述符。
      b、addr:sockaddr类型的指针变量,用来存放提出连接请求服务的主机信息。
      c、accept函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,如果没有错误,accept()函数返回一个新想socket描述符,供这个新连接来实用,而服务器可以继续在以前的socket上监听,同时可以在新的socket描述符上进行数据发送和数据接收(sent()和recv()操作)。
      6.sent()和recv()函数
      用于在面向连接(TCP)的socket上进行数据传输。
      send()函数原型:
      int send(int sockfd, const void* msg, int len, int flags) ;
      a、sockfd:用于传输数据的socket描述符。
      b、msg:是一个指向要发送数据的指针。
      c、len:以字节为单位的数据的长度。
      d、flags:一般情况下置为0。
      e、函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,否则返回所发送数据的总数,该数字可能小于len中所规定的大小。
      recv()函数原型:
      int recv(int sockfd, void* buf, int len, unsigned int flags);
      a、sockfd:是接收数据的socket描述符。
      b、buf:是存放接收数据的缓冲区。
      c、len:以字节为单位的缓冲区的长度。
      d、flags:一般情况下置为0。
      e、函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,无错则返回读入的字节数,如果连接被中止,返回0。
      7.endto()和recvfrom()函数
      这两个函数是利用数据报方式(UDP)进行数据传输。在无连接的数据报socket方式下,由于本地socket并没有与远程机器建立连接,所以在发送数据时应指明目的地址。
      sendto()原型:
      int sendto(int sockfd, const void* msg, int len, unsigned int flags, const struct sockaddr* to, int tolen);
      a、sockfd:用于传输数据的socket描述符。
      b、msg:是一个指向要发送数据的指针。
      c、len:以字节为单位的数据的长度。
      d、flags:一般情况下置为0。
      e、函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,否则返回所发送数据的总数,该数字可能小于len中所规定的大小。
      f、表示目的机器的IP地址和端口号。
      g、tolen:被赋值为sizeof(struct sockaddr)。
      recvfrom函数原型:
      int recv(int sockfd, void* buf, int len, unsigned int flags, struct sockaddr* from, int fromlen);
      a、sockfd:是接收数据的socket描述符。
      b、buf:是存放接收数据的缓冲区。
      c、len:以字节为单位的缓冲区的长度。
      d、flags:一般情况下置为0。
      e、函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,无错则返回读入的字节数,如果连接被中止,返回0。
      f、from:保存源机器的IP地址和端口号。
      g、fromlen:常被赋值为sizeof(struct sockaddr)。
      当对于数据报socket调用了connect()函数时,也可以用send()和recv()进行数据传输,但该socket仍然是数据报socket,并利用传输层的UDP服务。但是在发送或接收数据报时,内核会自动为它加上目的地址和源地址信息。
      8.close()和shutdown()函数
      当所有的数据操作结束后,可以调用close函数来释放该socket资源,从而停止在该socket上的任何数据操作。
      也可以调用shutdown函数,允许只停止在某个方向上的数据传输,而另一个方向上的数据传输继续进行。例如可以关闭某一个socket上的写操作uo允许继续在该socket上接收数据,直到读入所有数据。
      但是,shutdown函数并不关闭套接字所占用的所有资源,除非调用close函数来释放。
      看看两个函数原型:
      close(int sockfd);
      shutdown(int sockfd, int how);
      how参数的值和含义:
      0:不允许继续接收数据;
      1:不允许继续发送数据;
      2:不允许继续发送和接收数据。
      shutdown在操作成功时返回0,错误时返回-1,并置errno值。
      9.字节顺序转换函数
      htons():Host to Network Short的缩写,该函数将主机的无符合短整型数字节顺序转换成网络字节顺序。
      htonl():Host to Network Long的缩写,该函数将主机的无符合长整型数字节顺序转换成网络字节顺序。
      ntohs():Network to Host Short的缩写,该函数将无符号短整型数从网络字节顺序转换为主机字节顺序。
      ntohl():Network to Host long的缩写,该函数将无符号长整型数从网络字节顺序转换为主机字节顺序。

    • web服务器

    • 服务器和客户端的实现

    并发编程

    • 进程 线程 I/O多路复用

    • 基于进程的并发编程
      构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。

    • I/O多路复用
      select函数

    • 线程

    线程:运行在进程上下文中的逻辑流。
    线程有自己的线程上下文,包括一个唯一的整数线程ID、栈、栈指针、程序计数器、通用目的寄存器和条件码。所有运行在一个进程里的线程共享该进程的整个虚拟地址空间。
    线程执行模型

    • posix线程
    • 创建线程
    • 终止线程
    • 回收资源
    • 分离线程
    • 初始化线程
  • 相关阅读:
    [转载] VsCode中使用Emmet神器快速编写HTML代码
    Hexo 博客部署到私有云服务器
    钉钉小程序通过 Canvas 将页面生成图片并保存到本地相册
    2021你应该了解的前端知识体系
    JavaScript 中的模块化
    vue中click事件方法不加括号则会将事件作为入参
    css:左右元素没对齐,调整子元素的vertical-align属性
    js通过宽高特征对图片进行分类
    配置服务器上的git仓库
    js获取当前设备信息
  • 原文地址:https://www.cnblogs.com/Vventador/p/10015437.html
Copyright © 2020-2023  润新知