0 引言
本文记录在linux平台下,使用C++进行网络编程的第一篇文章。从tcp编程流程出发,引出C++网络编程相关的知识,如果有需要会结合《TCP/IP详解 》进行部分原理讲解。
1 Socket函数总结
本文及以后文章中可能用到的socket函数如下
接口名 | 功能简述 |
socket() | 创建和初始化一个新的socket |
bind() | 将套接字与特定的本地 IP 地址和端口号相关联 |
listen() | 在服务器上用于使 TCP 套接字侦听新连接 |
connect() | 用于在客户端设置远程地址和端口。 在 TCP 的情况下,它也建立一个连接 |
accept() | 在服务器上用于为到达的 TCP 连接创建新套接字 |
send() /recv() | 用于通过套接字发送和接收数据 |
sendto() / recvfrom() | 用于从没有绑定远程地址的套接字发送和接收数据 |
close() | 用于关闭套接字。 在 TCP 的情况下,这也会终止连接 |
shutdown() | 用于关闭 TCP 连接的一侧, 确保有序的连接关闭很有用 |
select()/epoll() | 用于等待一个或多个套接字上的事件 |
getnameinfo() / getaddrinfo() | 提供一种独立于协议的方式来处理主机名和地址 |
setsockopt() | 用于更改一些套接字选项 |
fcntl() | 用于获取和设置一些套接字选项 |
2 Tcp编程流程
TCP编程的具体流程如下图所示
具体来说,可分为 客户端编程和服务端编程(C/S模型)
针对客户端编程,其流程解释如下:
- 获得服务端地址(ip/port),此处一般通过getaddrinfo()接口获得
- 调用socket()接口创建新的socket
- 调用connect()建立新连接
- 调用send()和recv()接口同服务端交换数据
- 调用close()接口关闭连接
针对服务端编程,其流程解释如下:
TCP server需要在特定地址侦听连接的到来
- 调用getaddrinfo()获取侦听的地址
- 调用socket()创建侦听套接字
- 套接字必须绑定到监听 IP 地址和端口,这个由bind()接口完成
-
listen(),这会使套接字处于侦听新连接的状态
-
accept(),它将等待客户端与服务器建立连接。 建立新连接后,accept() 返回一个新套接字
-
send() 和recv()接口同客户端交换数据