sockaddr_in的结构: 因为我们主要用到网络通信,所以这里主要介绍这个结构体,打开
/usr/include/linux/in.h
文章插图
sin_family
代表的是地址类型,我们主要用的是AF_INET
,sin_port
代表的是端口号,sin_addr
代表的是网络地址,也就是IP地址,用了一个结构体struct in_addr
进行描述struct in_addr{ _be32 a_addr;}
这里填充的就是IPv4的地址,一个32位的整数地址转换函数IP地址可以用点分十进制的字符串(例如127.0.0.1),这里涉及到字符串和32位整网络的大端数据之间的相互转换 。下面价绍二者之间转化的库函数:
int inet_pton(int af, const char *src, void *dst);功能: 将点分十进制字符串转换成32位网络大端的数据参数: af:AF_INET IPV4AF_INET6 TPV6 src:点分十进制串的首地址 dst:32位网络数据的地址返回值:成功返回1,失败返回-1const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);功能: 将32位大端的网络数据转化成点分十进制字符串参数: af:AF_INET IPV4AF_INET6 TPV6 src:32位大端的网络数据地址 dst:存储点分十进制串地址 size:存储点分进制串数组的大小返回值:成功则返回指向数组的指针,出错返回NULL注意:net_ntop函数的dst参数不可以是一个空指针 。调用者必须为目标存储单元分配内存并指定其大小,调用成功时,这个指针就是该函数的返回值char *inet_ntoa(struct in_addr in);参数: in_addr:描述ip地址的结构体
注意: inet_ntoa这个函数内部会申请一块空间,保存转换后的IP的结果,这块空间被放在静态存储区,不需要我们手动释放 。且第二次调用该函数,会把结果放到上一次的静态存储区中,所以会覆盖上一次调用该函数的结果,是线程不安全的 。inet_ntop这个函数是由调用者自己提供一个缓冲区保存结果,是线程安全的 。TCP通信的基本流程服务端:
1. 调用 socket 函数创建 socket(侦听socket)2. 调用 bind 函数 将 socket绑定到某个ip和端口的二元组上3. 调用 listen 函数 开启侦听4. 当有客户端请求连接上来后,调用 accept 函数接受连接,产生一个新的 socket(客户端 socket)5. 基于新产生的 socket 调用 send 或 recv 函数开始与客户端进行数据交流6. 通信结束后,调用 close 函数关闭侦听 socket
文章插图
看上图:给大家讲解一下服务端的流程
1.首先服务端会调用socket函数创建一个套接字,上面说过了套接字是一个特殊的”网络文件“,存在读写缓冲区
经验总结扩展阅读
- 抓包分析 TCP 握手和挥手
- 概念+协议的了解+OSI七层模型,TCP/IP五层协议,网络数据传输流程 Linux--网络基础
- 关于网页实现串口或者TCP通讯的说明
- 如何kill一条TCP连接?
- TCP 序列号和确认号是如何变化的?
- 2d游戏怎么编程(怎么编写一个2d游戏)
- 怎么编写游戏程序(游戏外挂编写教程)
- Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
- 手写编程语言-如何为 GScript 编写标准库
- 编写HelloWorld并运行