| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络套接字编程(未完成) -> 正文阅读 |
|
[网络协议]网络套接字编程(未完成) |
套接字编程: 即网络通信程序的编写. 网络中的通信都是两端主机之间的通信: 客户端和服务端 qq聊天并不是自己跟另一个手机或者电脑用户在通信,实际上是跟腾讯的服务器在进行通信,把一个消息发到某个群,其实是把数据发送给了服务器,描述了数据在哪个群,服务器就能找到群里有哪些用户,这些用户也登录了服务器,就可以把数据逐一发送给对应的主机。 网络通信编程有: tcp协议通信程序的编写, udp通信程序的编写 tcp协议和udp协议的区别初识: UDP通信程序的编写:网络传输中的数据都会具有五元组: sip(源端ip地址), sport(源端端口),dip(对端ip地址),dport(对端端口),protocol(使用的协议) 客户端要给服务端发送数据,他怎么知道服务端是谁? udp通信流程*:接口认识:1. 创建套接字: int socket(int domain, int type, int protocol) domain: 地址域类型,决定通信使用的地址结构, IPV4地址域类型为AF_INET type:套接字类型,决定套接字传输方式, SOCK_DGRAM:无连接的,不可靠的数据报传输服务(UDP). SOCK_STREAM:基于连接的有序的可靠的字节流传输服务(TCP). protocol: 决定使用的协议类型, IPPROTO_TCP, IPPROTO_UDP.? 返回值: 套接字的操作句柄(文件描述符),用于后续接口传参操作.?失败返回-1. 2. 绑定地址信息: int bind(int sockfd, struct sockaddr *addr, socklen_t len) sockfd: socket()返回的操作句柄, 决定了给哪个套接字绑定地址信息 addr: 绑定的地址信息.??struct sockaddr是通用地址结构, 一般不使用这个类型根据上面socket()的domain对应的地址结构决定, 传参时强转为通用的就行. IPV4地址结构为sockaddr_in, IPV6为sockaddr_in6.?(因为使用的地址域多种多样, 地址结构不同,但bind接口只有一个,所以统一用通用的作为传入,bind接口内部会根据前2个字节决定传入的地质结构该如何解析.) len: 地址信息长度. 指定前一个参数的长度, 防止访问越界 所以常写为: bind(sockfd,(sruct sockaddr*)& addr, sizeof(addr)) 返回值:?成功返回0,失败返回-1. 3.发送数据: ssize_t sendto(int sockfd, void* buf, int len, itn flag, struct sockaddr* peer_addr, socklen_t len) sockfd: socked()返回的操作句柄. buf:?要发送的数据首地址. len:?发送数据的长度. flag: 标志位, 0默认为阻塞操作.? peer_addr: 对端地址信息(接收数据那端). 也是根据对应的强转为通用的 addrlen: 地址信息长度 返回值: 成功返回实际发送的数据长度, 失败返回-1. 4.接收数据: ssize_t recvfrom(int sockfd, void* buf, int len, int flag, struct sockaddr* peer_addr, socklen_t* addrlen) sockfd: socked()返回的操作句柄. buf:?要存放数据的一块缓冲区空间首地址. len: 要获取的数据的长度. flag: 标志位, 0默认为阻塞操作. 缓冲区没有数据则等待. peer_addr: 获取数据的源端地址信息(发送数据那端), 创建一个strcut sockaddr_in传入recvfrom接口内部会使之接收,?也是根据对应的强转为通用.(客户端实际上不需要获取服务端地址信息,因为本来就封装有了) addrlen: 输入输出参数, 用于指定要获取的地址长度以及返回的实际长度 返回值: 成功返回实际收到的数据长度, 失败返回-1. 5.关闭套接字: int close(int sockfd) 字节序转换接口*:网络通信使用的是网络字节序, 因此需要字节序转换.? 16位数据主机与网络字节序转换: uint16_t? htons(unit16_t port),? uint16_t ntohs(uint16_t port) 32位数据主机与网络字节序转换: uint32_t? htonl(uint32_t ip),??uint32_t? ntohl(uint32_t ip) host to net 主机转网络, net to host网络转主机,?不限于port和ip的转换. 绑定时,把指定端口用htons()转后赋给sin_port. 不能用htonl,且用自己的主机地址(虚拟机地址) 接收数据时把数据发送端的地址信息中sin_port用ntohs()转出来. 将点分十进制的字符串ip地址转换为网络字节序整数的ip地址(IPV4): in_addr_t? ?inet_addr(char* ip) 转之后赋给sin_addr.s_addr 将网络字节序整数的ip地址转换为点分十进制的字符串ip地址(IPV4): char*? ?inet_ntoa(struct in_addr sin_addr), 注意这个参数不需要深入到in_addr里的in_addr_t 而上面的返回值是深入到in_addr_t inet_ntop() / inet_pton(): IPV4和IPV6都可以 查看网络连接状态的命令:netstat -p查看对应网络状态信息所属的进程 -u udp连接信息 实现构建思路:首先使用C语言编写udp服务端程序---了解接口的实际使用与细节流程 udp_srv.c:udp_socket.hpp:udp_client.cpp:?实现效果:上图展现了不同客户端, 由于没绑定, 不同的客户端发送消息给服务端操作系统就会自己分配不同的地址信息(端口,由于咱虚拟机ip不是动态分配的固定192.168.170.128所以ip地址没变).? |
|
网络协议 最新文章 |
使用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/26 11:37:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |