LinuxC 搭建简单的TCP服务器
1. 问题
在标题之前,先提几个问题,方便下次查看理解。
- 什么是TCP
- TCP服务器需要用到哪些函数
- 如何简单的搭建一个TCP服务器
2. 什么是TCP
TCP 是一种传输层协议,可以提供可靠的数据传输服务。它是面向连接的,具有可靠性、流量控制、拥塞控制以及双工通信的特点。
3. TCP 服务器需要用到哪些函数
1. socket
int socket(int domain, int type, int protocol); //声明
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //示例
socket 作用是用来创建一个文件描述符也成为套接字描述符,用于根据我们指定的协议族、数据类型和协议来分配一个套接字描述符以及它所用到的资源。函数调用失败返回-1,调用成功返回正整数。
参数说明:
domain
:指定协议族,常用的有AF_INET
(IPv4 地址)和AF_INET6
(IPv6 地址)、AF_LOCAL
、AF_ROUTE
等。type
:指定套接字类型,有3种类型,常用的有SOCK_STREAM
(流式套接字,用于 TCP 协议)和SOCK_DGRAM
(数据报套接字,用于 UDP 协议)。第三种为SOCK_RAW
,为原始类型,允许对底层协议(如 IP, ICMP)进行直接访问。protocol
:指定协议,通常设置为 0,表示让系统根据domain
和type
自动选择合适的协议。
底层逻辑:
socket()
函数的底层逻辑主要涉及创建一个套接字数据结构,注册到内核中,为该套接字分配一个唯一的文件描述符,并返回该文件描述符。具体步骤如下:
- 创建套接字数据结构:根据指定的通信域、套接字类型和协议,创建一个套接字数据结构,用于表示一个通信端点。
- 分配文件描述符:在内核中分配一个文件描述符,用于标识这个套接字。
- 注册到内核中:将套接字数据结构注册到内核的套接字表中,以便内核能够识别和管理这个套接字。
- 返回文件描述符:将分配的文件描述符返回给调用者,以便后续对套接字的操作。
2. bind
// 声明
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
// 示例
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(struct sockaddr_in));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(2048);
if (-1 == bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)))
{
perror