首页 > 编程语言 >tcp编程

tcp编程

时间:2022-12-23 16:37:18浏览次数:34  
标签:socket 握手 编程 端口 tcp 客户端 端口号 服务器端

面试官:描述一下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

标签:socket,握手,编程,端口,tcp,客户端,端口号,服务器端
From: https://www.cnblogs.com/ice-arrow/p/17000971.html

相关文章

  • Shell编程 第 6~11 章
    Shell编程第6~11章第6章流程控制(重点)、第6章流程控制(重点)6.1if判断语法(1)单分支if[条件判断式];then程序fi或者if[条件判断式]then程序fi......
  • Shell编程 第 1~5章
    Shell编程第1~5章第1章Shell概述、第2章Shell脚本入门、第3章变量、第4章运算符、第5章条件判断第1章Shell概述什么是Shell在计算机科学中,Sh......
  • 03_Java筑基之Java编程基础
    03_Java筑基之Java编程基础我们是学习软件开发的,必然离不开计算机,所以在进行学习之前,首先要了解一些必要的计算机基础知识.一.计算机基础1.......
  • 【操作系统---并发编程】CPU cache结构和缓存一致性(MESI协议)
    转载自:https://blog.csdn.net/reliveIT/article/details/50450136?spm=1001.2014.3001.5506(三人行,必有我师) 一、cachecpucache已经发展到了三级缓存结构,基本上现在......
  • TCP 链接关闭 -- 客户端为什么需要60秒的time_wait状态
    客户端主动关闭连接时(FIN->ACK<-FIN<-ACK->),在发送最后一个ack后会进入TIME_WAIT状态,停留2个MSL时间,进入CLOSED状态MSL就是maximumsegmentlifetime(最大分节生命......
  • 搭建"积木"=编程?
    如果你不用写一行代码就能构建软件会怎么样呢?而这就是无代码开发背后的前提,这种软件开发方法的势头在我们国内发展的越来越大。在无代码平台的帮助下,无需编写任何底层代码就......
  • 无码编程:无代码软件开发大行其道
    代码是大多数软件程序和应用程序的骨干。每行代码充当一条指令:采用一种逐步性的逻辑机制,以便计算机、服务器和其他机器执行操作。想创建那些指令,就要知道如何编写代码,这项宝......
  • Java编程思想5
    第十章:内部类可以将一个类得定义放在另一个类得定义内部,这就是内部类。链接到外部类在最初,内部类看起来就像是一种代码隐藏机制;其实它还有其他用途。当生成一个内部类的对......
  • Java编程思想6
    第十九章:枚举类型关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。enum的基本特性  我们......
  • 并发编程:进程+线程+协程
    现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节,并且管理......