TCP服务器的编写(下)

我们现在开始对我们的客户端开始封装

TCP服务器的编写(下)_第1张图片

我们的客户端,创建完套接字,需不需要bind呢??

当然是不需要的,你本身是一个客户端,其他人写的应用也可能是客户端,如果我们bind,一定意味着我们当前客户端进程绑定的一定是一个非常具体的端口号,一旦绑定的是一个具体的端口号,换而言之,A客户端,B客户端,是由不同的软件公司提供的,那么这里绑定的端口号,有可能在不经过商量的情况下,冲突,那么就势必会有某一个客户端启动不起来!!

那么我们不需要显示的bind,但是一定是需要port

需要让我们的操作系统自动进行port的选择

但是客户端一定要有连接别人的能力  ---connect

TCP服务器的编写(下)_第2张图片

connect返回值  连接成功返回0  失败-1被返回,错误码被设置

因为connect是系统调用接口,所有OS在connect的时候会自动的给我们的客户端绑定当前客户端的IP和端口

TCP服务器的编写(下)_第3张图片

------------------------------------------------------------------------------------------------------------------------

TCP服务器的编写(下)_第4张图片

  TCP服务器的编写(下)_第5张图片

TCP服务器的编写(下)_第6张图片

TCP服务器的编写(下)_第7张图片

这样,我们的客户端初型差不多就完成了,我们现在可以来简单测试一下

TCP服务器的编写(下)_第8张图片

TCP服务器的编写(下)_第9张图片

TCP服务器的编写(下)_第10张图片

TCP服务器的编写(下)_第11张图片

现在客户端发的所有消息,服务器全部都能收到,服务器会把收到的消息转会给客户端,完成一个数据的通路

TCP服务器的编写(下)_第12张图片

TCP服务器的编写(下)_第13张图片

接下来我们基于这一份基本的代码,来做下一步的完善

TCP服务器的编写(下)_第14张图片

TCP服务器的编写(下)_第15张图片

TCP服务器的编写(下)_第16张图片

TCP服务器的编写(下)_第17张图片

这时候父进程就不在回收资源的任务,就交给OS去回收

-------------------------------------------------------------------------------------------------------------------------------

但是创建进程的成本太高了,毕竟进程是承担系统资源分配的实体

所有我们可以试着采用多线程版本

TCP服务器的编写(下)_第18张图片

在多线程这里用不用进程关闭特定的文件描述符呢??

不需要,多进程当中每个进程都有文件描述符表,但是在多线程这里每一个线程,和我们的主线程是会共享文件描述符表的!!!!

TCP服务器的编写(下)_第19张图片

TCP服务器的编写(下)_第20张图片

TCP服务器的编写(下)_第21张图片

--------------------------------------------------------------------------------------------------------------------------------

可是每一次过来呢,来了一个新链接,我们去创建新线程去处理, 每一次,创建一个线程成本也挺高的,我们呢,能不能预先创建一批线程,链接到来时,把整个的链接包装成任务,把他投递到后端的消息队列当中,挑选出特定的一个线程去处理

线程池版本

TCP服务器的编写(下)_第22张图片

TCP服务器的编写(下)_第23张图片

你可能感兴趣的:(Linux模块学习,服务器,运维)