| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络学习笔记(4)---Socket编程 -> 正文阅读 |
|
[网络协议]计算机网络学习笔记(4)---Socket编程 |
目录 1 Socket编程-应用编程接口(API)1.1 网络程序设计接口 ?1.2 应用编程接口API(Application Programming Interface) 1.3 几种典型的应用编程接口? ? ?1.4 Socket API ? ?1.5 Socket 抽象---类似于文件的抽象 当应用进程创建套接字时,操作系统分配一个数据结构存储该套接字相关信息; 地址结构:已定义结构sockaddr_in? ? ?使用TCP/IP协议簇的网络应用程序声明端点地址变量时,使用结构sockaddr_in ?1.6 Scoket编程-Socket API函数 ? ?(1)WSAStartup---使用Socket应用程序在使用Socket之前必须首先调用 ?(2)WSACleanup---在完成对请求的Socket库的使用后,最后要调用WSAClenup函数 ? ?(3)socket---创建套接字socket (4)Closesocket---关闭一个描述符为sd的套接字socket (5)bind?---绑定套接字的本地端点地址(IP地址+端口号) ? ?(6)listen---设置服务器端的流套接字处于监听状态---只用于服务端 ?(7)connect---只用于客户端 (8)accept?---创建新的套接字socket,以提供并发服务 ?(9)send、sendto---发送数据 ? ?(10)recv、recvfrom---接收数据 ? ?(11)setsockpt、getsockopt---套接字参数的设置及读取 ? 总结:Scoket API函数小结? ? ? ?1.7 Socket面向TCP/IP的服务类型 ?(1)TCP:可靠、面向连接、字节流传输、点对点; ?(2)UDP:不可靠、无连接、数据报传输; 1.8 网络字节顺序 (1)TCP/IP定义了标准的用于协议头中的二进制整数表示:网络字节顺序(network byte order) (2)某些Socket API函数的参数需要存储为网络字节顺序(如IP地址、端口号等) (3)可以实现本地字节顺序与网络字节顺序间转换的函数 1.9 网络应用的Socket API(TCP)调用基本流程? ? ?2 Socket编程-客户端/服务端软件设计?2.1 解析服务器IP地址 (1)客户端可能使用域名(如study.163.com)或IP地址(如:123.58.180.21)标识服务器; (2)IP协议需要使用32位二进制IP地址; (3)需要将域名或点分十进制IP地址转换为32位IP地址; ?2.2 解析服务器(熟知)端口号 (1)客户端还可能使用服务名(如HTTP)标识服务器端口; (2)需要将服务名转换为熟知端口号;函数getservbyname();返回一个指向结构servent的指针 ?2.3 解析协议号 (1)客户端可能使用协议名(如:TCP)制定协议; (2)需要将协议名转换为协议号(如:6);函数getprotobyname()实现协议名到协议号的转换; 返回一个指向结构protoent的指针; ?2.4 TCP客户端软件流程 ? 2.5 UDP客户端软件流程? ? ?2.6 Socket编程-服务器软件设计 2.6.1?四种类型基本服务器 (1)循环无连接(Iterative connectionless)服务器; (2)循环面向连接(Iterative connection-oriented)服务器; (3)并发无连接(Concurrent connectionless)服务器; (4)并发面向连接(Concurrent connection-oriented)服务器; 2.6.2 循环无连接服务器基本流程 (1)创建套接字; (2)绑定端点地址(INADDR_ANY+端口号); (3)反复接收来自客户端的请求; (4)遵循应用层协议,构造响应报文,发送给客户; 1、数据发送:? (1)服务端不能使用connect()函数;(2)无连接服务器使用sedto()函数发送数据报; ?socket:服务器(UDP)套接字;data:(指针-存储待发送数据缓存的地址);length:(缓存中数据字节数);flags:(调试或控制选项,一般置零);destaddr:(指向结构sockaddr_in)的指针(客户端端点地址);addrlen:地址结构长度; 2、获取客户端点地址 调用recvfrom()函数接收数据时,自动提取; ?socket:(UDP)服务器套接字;buf:存放数据报的缓存地址;length:缓存可用空间;flags:调试或控制选项;from:存放源地址的缓存地址,客户端的端点地址;fromlen:源地址长度; 2.6.3 循环面向连接服务器基本流程 (1)创建(主)套接字,并绑定熟知端口号; (2)设置(主)套接字为被动监听模式,准备用于服务器; (3)调用accept()函数接收下一个连接请求(通过主套接字),创建新套接字与该客户建立连接; (4)遵循应用协议,反复接收客户端请求,构造并发送响应(通过新套接字); (5)完成为特定客户服务后,关闭与该客户之间的连接,返回步骤3; 2.6.4 并发无连接服务器基本流程 主线程1:创建套接字,并绑定熟知端口号; 主线程2:反复调用recvfrom()函数,接收下一个客户请求,并创建心线程处理该客户响应; 子线程1:接受一个特定请求; 子线程2:依据应用层协议构造响应报文,并调用sedto()发送; 子线程3:退出(一个子线程处理一个请求后即终止); 2.6.5 并发面向连接服务器基本流程 主线程1:创建(主)套接字,并绑定熟知端口号; 主线程2:设置(主)套接字为被动监听模式,准备用于服务器; 主线程3:反复调用accept()函数接收下一个连接请求(通过主套接字),并创建一个新的子线程处理该客户响应; 子线程1:接收一个客户的服务请求(通过新创建的套接字); 子线程2:遵循应用层协议与特定客户进行交互; 子线程3:关闭/释放连接并退出(线程终止); |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:49:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |