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函数创建一个套接字,上面说过了套接字是一个特殊的”网络文件“ , 存在读写缓冲区
2.调用bind函数将这个套接字绑定ip和端口号,注意此时的ip和端口号都是服务器自己的端口号和ip,因为服务器是被动的连接,生成的是监听套接字,监听的是客户端发来的要连接的服务器的ip和端口号,监听套接字会查看自己绑定的ip和端口号和客户端发来的要连接的服务器的ip和端口号是否和自己一样 , 才能决定是否接受连接
3.调用listen函数,使得套接字变成一个被动的监听套接字,使已绑定的套接字等待监听客户端的连接请求 , 并设置服务器同时可以连接的数量(已连接队列和未连接队列),当监听到客户端发来的ip和端口号与未连接队列中的套接字吻合时 , 就把客户端发来的套接字信息放到已连接队列当中
4.调用accept函数,如果listen已连接队列中没有请求的话 , 该函数会阻塞 , 直到连接队列发来信息,该函数的第一个参数用来标识服务端套接字 , 第二个参数用来保存客户端套接字,实际上accept函数指定了服务器接收客户端的连接,并将客户端的套接字信息(ip和端口)保存了下来,因为当服务器给客户端发送数据的时候需要知道客户端的ip和端口
- 值得注意的是,accept会生成一个新的套接字链接,这个套接字已经连接了服务器和客户端,原来的监听套接字和客户端的连接就会断开,以后的通信就是新的连接套接字和客户端进行通信
- 为什么要建立一个新的套接字呢?因为监听套接字有自己的工作,还需要监听其他来访的客户端的连接请求,如果用监听套接字和客户端进行通信,那么其他客户端想要连接该服务器的端口就不会成功,影响很大
6.通信结束后,调用 close 函数关闭侦听 socket
客户端:
1. 调用 socket函数创建客户端 socket2. 调用 connect 函数尝试连接服务器3. 连接成功以后调用 send 或 recv 函数开始与服务器进行数据交流4. 通信结束后 , 调用 close 函数关闭侦听socket
【TCP套接字编写,多进程多线程版本 Linux网络通信】
文章插图
TCP相关的套接字APITCP是面向连接的 , 不同于UDP,TCP需要创建好套接字并且绑定端口号,绑定好之后,还需要进行监听,等待并获取连接 。
- listen
int listen(int sockfd, int backlog);功能: 将套接字设置为监听状态,监听socket的到来参数: sockfd:要设置的套接字(称为监听套接字) backlog:连接队列的长度返回值:成功返回0,失败返回-1
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 抓包分析 TCP 握手和挥手
- 概念+协议的了解+OSI七层模型,TCP/IP五层协议,网络数据传输流程 Linux--网络基础
- 关于网页实现串口或者TCP通讯的说明
- 如何kill一条TCP连接?
- TCP 序列号和确认号是如何变化的?
- 2d游戏怎么编程(怎么编写一个2d游戏)
- 怎么编写游戏程序(游戏外挂编写教程)
- Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
- 手写编程语言-如何为 GScript 编写标准库
- 编写HelloWorld并运行