基于TCP协议的服务器

本文介绍了TCP协议的基础知识,并探讨了基于TCP协议的服务器实现,包括单进程阻塞版本的问题及多进程和多线程解决方案。在多进程版本中,通过fork子进程和创建孙进程来处理客户端连接,而在多线程版本中,创建线程与客户端进行数据传输。文章强调了处理进程或线程结束时资源回收的重要性。
摘要由CSDN通过智能技术生成

本博客已弃用,当时存在一些小细节错误后期也不再修改了

欢迎来我的新博客

先复习一下UDP协议:UDP协议为"user datagram protocol",用户数据报协议,对于UDP来说,其最小传输单元是数据报,并且是只管发送,不用建立连接,尽最大可能的发送数据,不保证可靠性。由于其不能拆分、合并应用层传递下来的报文,导致不能灵活的控制接收的次数与数量,且单个数据报最大只能是64k,但是由于不用建立连接,使其非常轻便、快速,且占用资源少。

TCP协议为"Transmission Control Protocol",传输控制协议。名副其实,TCP协议对数据传输的每一个细节几乎都控制到了,当然,这也导致TCP协议相当复杂,很多细节,如最开始的连接过程的三次握手到断开连接的四次挥手、超时重传机制、滑动窗口、流量控制、拥塞控制、延迟应答等等,都是TCP的非常重要的机制,在此我们就不讨论这些了,讲这方面的书籍与资源实在太多了。

因为既要保证可靠性,又要使性能尽可能的高,所以TCP的相对UDP较复杂是必然的。与UDP相反,TCP面向字节流,收发信息用系统调用write与read即可完成,既然面向字节流,那么无疑是可以自己灵活的控制读写次数,对于对方发来的100字节的数据,我可以分100次读,也可以一次读,同时在write数据时,如果数据太长,TCP协议会给你做好分包工作。当然,其传输的可靠性、重传机制以及高效性都非常不错,不过本篇我们的重点不是讲通信细节,而是服务器的实现,在此就不一一去说了。但是值得注意的是,这些理论是相当重要的,这是一个程序员必须保证的基本功,对于TCP协议应该清楚的知道每个api对应了哪些通信细节与机制。


TCP协议的常用接口

// 创建 socket ⽂文件描述符 ( 客户端 + 服务器)

int socket(int domain, int type, int protocol);

// 绑定端⼝口号 ( 服务器)      

int bind(int socket, const struct sockaddr *address, socklen_t address_len);

// 开始监听socket ( 服务器)

int listen(int socket, int backlog);

// 接收请求 (服务器)

int accept(int socket, struct sockaddr* address, socklen_t* address_len);

// 建⽴立连接 (客户端)

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

我们仍然写一个echo聊天服务器,首先是最简单的单进程阻塞版本

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值