本文记录在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() | 用于获取和设置一些套接字选项 |
TCP编程的具体流程如下图所示
具体来说,可分为 客户端编程和服务端编程(C/S模型)
针对客户端编程,其流程解释如下:
- 获得服务端地址(ip/port),此处一般通过getaddrinfo()接口获得
- 调用socket()接口创建新的socket
- 调用connect()建立新连接
- 调用send()和recv()接口同服务端交换数据
- 调用close()接口关闭连接
针对服务端编程,其流程解释如下:
TCP server需要在特定地址侦听连接的到来
- 调用getaddrinfo()获取侦听的地址
- 调用socket()创建侦听套接字
- 套接字必须绑定到监听 IP 地址和端口,这个由bind()接口完成
-
listen(),这会使套接字处于侦听新连接的状态
-
accept(),它将等待客户端与服务器建立连接。 建立新连接后,accept() 返回一个新套接字
-
send() 和recv()接口同客户端交换数据



