| |
|
|
开发:
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图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/7 18:36:57- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |