面试官:描述一下TCP的编程流程?
答:TCP服务器端编程的一般步骤是: TCP客户端编程的一般步骤是:
1.创建一个socket,用函数socket(); 1.创建一个socket,用函数socket();
2.设置socket属性 2.设置socket属性
3.绑定ip地址、端口等信息到socket上,用函数bind(); 3.绑定IP地址、端口等信息到socket 上(此步骤可省略)
4..开启监听,用函数listen(); 4.设置要连接的对方的IP地址和端口等属性
5.接受客户端上来的连接,用函数accept(); 5.连接服务器
6.收发数据,用函数send()和recv() 6.收发数据,用函数send()和recv()
7.关闭网络连接,closesocket 7.关闭网络连接
8.关闭连接
面试官:能简单实现一下吗?
服务器端代码实现:
客户端代码实现:
面试官:问你结果细节问题
服务器端为什么要有绑定,而客户端没有?
首先bind函数的作用是将套接字绑定一个IP地址和端口号。这个端口号是内核临时指定的一个空闲端口,是随机的,是内核临时指定的需要执行特殊任务的端口,每次执行服务器程序的时候,使用的都是不同的端口号。客户端在与服务器端通信时,需要指定通信的服务器的端口,如果每次连接服务器,服务器都需要先寻找一个空闲端口号,那么就太不合理了。那么绑定就是,我服务器端现在要占用这个端口号,其它的客户端需要和我通信是,都必须通过这个端口号来连接我。
客户端的端口和IP没有必要绑定。总不能说你只能访问这个谷歌,不能访问百度吧!
图解:
此时将客户端断开,再重新连接
我们发现,服务器端的端口并没有改变,但是客户端的端口号已经变了,这就是bind函数的作用。
说一下listen和accept的作用?
客户端在执行connect之后,开始进行三次握手,完成三次握手之后就可以和服务器端通信了,可能有很多个客户端同时连接服务器端,我们需要将那些未完成三次握手和已完成三次握手的客户端分开存放,这就是listen干的事情,他会创建两个监听队列,一个用来存放已完成三次握手的链接,一个用来存放未完成三次握手的链接;当完成三次握手的客户端与服务器完成通信后,就将它的链接从相应的队列中除去。
accept函数就是为了处理已完成三次握手的链接与服务器的通信的,如果listen的已完成三次握手的队列为空,那么accept就阻塞住了,直到有完成三次握手的链接时。注意:在执行accept之后,会得到与客户端通信的专属链接套接字c,利用这个c来收发数据。
说一下buff里边的4代表什么?
是这样的。每个进程都有属于自己的文件表,程序一旦启动,都会自动打开这三个文件,即:stdin(标准输入),stdout(标准输出),stderr(标准输出输出),它们对应的文件表序号就是前三个0,1,2,我们在整理创建的套接字占序号3,链接套接字占4
————————————————
版权声明:本文为CSDN博主「幽萌之雨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54669536/article/details/124393986