zoukankan      html  css  js  c++  java
  • 数据库引擎开发以及常见数据库内部原理学习(3):网络编程基础

    康奈尔笔记

    线索
    • 网络理论
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    • 程序流程
    1.记录:
    1. 网络原理
      • 计算机网路是一种允许计算机进行即时通讯的工具
      • 计算机物理连接可能是电缆也可能是无线介质
      • 生成、转发以及销毁数据的网络设备称之为网络节点
    2. OSI模型
      • 国际标准协议OSI模型是一种字面模型,而且跟IP协议没关系
      • 第一层:物理层:bit流传输,主要是物理介质
      • 第二层:数据链路层:提供介质访问,链路管理,各种链路转换
      • 第三层:网络层:寻址和路由的选择,路由器,转换寻址,路由器
      • 第四层:传输层:建立主机端到端的连接,4层,0保障最少,3最多
      • 第五层:会话层:建立、维护和管理会话,建立的检查点等机制
      • 第六层:表示层:处理数据格式、数据加密,提供与应用分离的格式
      • 第七层:应用层:提供应用程序间通信,识别资源模式
    3. IP协议
      • 为计算机网络相互连接进行通讯而设计的协议
      • 是一套由软件、程序所组成的协议,把各种系统不同的信息转换成统一的格式,使所有的网络节点能实现互通。
      • 第一层:链路层
      • 第二层:连接层,IPV4、IPV6
      • 第三层:传输层
      • 第四层:应用层
    4. TCP协议
      • TCP协议是IP协议组件中最重要的组成部分
      • TCP基于IP协议,提供了可靠,有序,错误校验的数据流,用于局域网和广域网中程序之间的信息交换。
      • 坐落于IP协议的传输层
    5. Socket套接字
      • 程序间通讯流的终端,客户端使用套接字进行通讯。
      • 套接字API是一种应用程序开发接口,一般由操作系统提供。(一般指广域网套接字)
      • 一般为IP地址与端口的结合
      • 组成:本地IP、远程IP、协议
    6. 程序流程
      • 客户端流程:建立套接字-连接服务器-进行通讯-关闭套接字
      • 服务端流程:建立套接字-监听-接收连接请求-进行通讯-接收客户端关闭套接字信息-关闭套接字
    7. 函数接口
      • socket()创建一个新的套接字并分配系统资源
      • bind()一般用于服务端,将套接字与套接字地址(例如本地端口以及IP地址)绑定
      • listen() 一般用于服务端,将绑定的TCP置于监听状态
      • connect() 一般用于客户端,分配一个本地的空闲端口,并且与远程地址建立连接
      • accept() 一般用于服务端,接受一个新的连接请求,并创建一个与该链接绑定的套接字
      • send() 与 recv(), 或 write() 与read(), 或sendto() 与recvfrom()用于发送和接收数据
      • close() 关闭一个打开的套接字并释放资源
      • gethostbyname() 与gethostbyaddr() 在IPv4协议中解析域名和地址
      • select() 用于等待一个或多个指定套接字的下一个读写事件
      • poll()用于测试一个或多个套接字的读写状态
      • getsockopt() 得到指定套接字的参数
      • setsockopt() 配置指定套接字的参数
    8. 典型服务端
        1. int main(void)
        2. {
        3. //套接字地址
        4. struct sockaddr_instSockAddr;
        5. //建立套接字
        6. intSocketFD= socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        7. //判断套接字是否成功
        8. if(-1==SocketFD)
        9. {
        10. perror("can not create socket");
        11. exit(EXIT_FAILURE);
        12. }
        13. //重置套接字地址信息
        14. memset(&stSockAddr,0,sizeof(stSockAddr));
        15. stSockAddr.sin_family= AF_INET;
        16. stSockAddr.sin_port= htons(1100);
        17. stSockAddr.sin_addr.s_addr= htonl(INADDR_ANY);
        18. //绑定端口
        19. if(-1== bind(SocketFD,(structsockaddr*)&stSockAddr,
        20. sizeof(stSockAddr)))
        21. {
        22. perror("error bind failed");
        23. close(SocketFD);
        24. exit(EXIT_FAILURE);
        25. }
        26. //监听端口
        27. if(-1== listen(SocketFD,10))
        28. {
        29. perror("error listen failed");
        30. close(SocketFD);
        31. exit(EXIT_FAILURE);
        32. }
        33. //循环
        34. for(;;)
        35. {
        36. //监听连接
        37. intConnectFD= accept(SocketFD, NULL, NULL);
        38. if(0>ConnectFD)
        39. {
        40. perror("error accept failed");
        41. close(SocketFD);
        42. exit(EXIT_FAILURE);
        43. }
        44. /* perform read write operations ...
        45. read(ConnectFD,buff,size)*/
        46. if(-1== shutdown(ConnectFD, SHUT_RDWR))
        47. {
        48. perror("can not shutdown socket");
        49. close(ConnectFD);
        50. close(SocketFD);
        51. exit(EXIT_FAILURE);
        52. }
        53. close(ConnectFD);
        54. }
        55. close(SocketFD);
        56. return EXIT_SUCCESS;
        57. }
    9. 典型客户端
        1. int main(void)
        2. {
        3. struct sockaddr_instSockAddr;
        4. intRes;
        5. intSocketFD= socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        6. if(-1==SocketFD)
        7. {
        8. perror("cannot create socket");
        9. exit(EXIT_FAILURE);
        10. }
        11. memset(&stSockAddr,0,sizeof(stSockAddr));
        12. stSockAddr.sin_family= AF_INET;
        13. stSockAddr.sin_port= htons(1100);
        14. Res= inet_pton(AF_INET,"192.168.1.3",&stSockAddr.sin_addr);
        15. }
        16. if(0>Res)
        17. {
        18. perror("error: first parameter is not a valid address family");
        19. close(SocketFD);
        20. exit(EXIT_FAILURE);
        21. }
        22. elseif(0==Res)
        23. {
        24. perror("char string (second parameter does not contain valid
        25. ipaddress)");
        26. close(SocketFD);
        27. exit(EXIT_FAILURE);
        28. }
        29. if(-1== connect(SocketFD,(struct sockaddr*)&stSockAddr,
        30. sizeof(stSockAddr)))
        31. {
        32. perror("connect failed");
        33. close(SocketFD);
        34. exit(EXIT_FAILURE);
        35. }
        36. /* perform read write operations ... */
        37. (void) shutdown(SocketFD, SHUT_RDWR);
        38. close(SocketFD);
        39. return EXIT_SUCCESS;
        40. }
    2.简化:
    1. 计算机网络是一种允许计算机通讯的工具。
    2. OSI模型是一种标准化的字面模型,没有真正的广泛运用,其包括:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
    3. IP网络互联协议是一种被广泛运用的互联网协议,主要包括:链路层、连接层、传输层、应用层。
    4. TCP基于IP协议,提供了可靠,有序,错误校验的数据流,是广泛运用与程序中间的。
    5. 套接字是一种一般由系统提供的应用程序开发接口。
    3.背诵:
    4.思考:
    1. 网络编程的难度到底在哪里,这里一直是我薄弱网络编程水平所无法真正理解的地方。作为一个java程序员,了解过c,api不难用,netty也关注过,似乎打造一个稳定的网络服务是一件非常麻烦的事情,作为程序员,其实在本质上很难理解对错之外的事情。这个似乎可以说得上是缺陷。能力上的缺陷。
    5.复习:
    1. 总结
    1. 数据库调优里面有这么句话,80%的数据库问题,与数据库本身无关,这些无关问题里面,又以网络问题为重中之重,Oracle的监听配置也是非常容易出现问题。
    2. 在分布式数据库时代,成本的开销主要集中在网络IO之上,所以说,网络对于数据库的重要性不言而喻。
    3. 我们这里网路暂时需要的是建立一个客户端与服务端的通讯
  • 相关阅读:
    [http://www.chromium.org/]Chromium项目Home
    [DevExpress]ASP.NET控件ASPxComboBox组合框小结(二)
    [C#多线程编程(三)]多线程使用
    拼音输入法你应该更高级点儿
    [实体框架编程] 第三章 查询实体数据模型(一)
    [C#多线程编程(一)] 导读
    [C#多线程编程(五)]并行编程
    [C#多线程编程(四)]高级线程编程
    LINQ之查询语法select子句
    log4net系列目录
  • 原文地址:https://www.cnblogs.com/jiaoweixue/p/3950668.html
Copyright © 2011-2022 走看看