【网络基础-socket套接口编程-TCP】面试一线大厂后才知道,面试官都希望你掌握这些套接口编程知识(bind,listen,connect,socket,accept)

首先对于访问上篇博文(【网络基础-计算机字节序】)的同学们表示感谢,对于第一篇博文就有1k左右的浏览量“零号”还是很开心的。以后也会争取给大家发布更有价值的,通俗易懂的博文。“零号‘’是开心了,但是“壹号”同学就没有这么顺利,他又面试失利了,他上篇博文搞定了“网络套接字”的问题,但这次又败在了对TCP套接口编程的理解上,此篇博文我们就说一说TCP套接口编程到底有哪些难搞的地方,有哪些坑容易被问到。照例,先列出失败的问题:

面试官问题1:TCP客户端与服务器端的创建过程您了解吗?

面试官问题2:可以谈谈您对于每个函数的理解吗?

面试官问题3:可以说一说您对listen以及accept函数的理解吗?

首先,先来了解一下TCP套接口编程的过程。如图1(图片来自UNIX网络编程-卷一)

                                                                      图1

从上图可以看出,客户与服务器的通信流程为:

服务器端:

  • 调用socket创建套接字描述字
  • 调用bind绑定服务ip和端口号
  • 调用listen将主动连接套接字改为被动连接套接字
  • 调用accept等待客户端连接
    • 有客户连接后:
      • read读取客户发送来的数据
      • 处理用户请求
      • write给客户发送回复信息
      • 处理完成后,调用close关闭accept返回的已连接套接字

客户端:

  • 调用socket创建套接字描述字
  • 调用connect请求连接服务器
    • 连接成功后:
      • write发送请求
      • read接收服务器的应答
      • 进行业务处理
      • 处理完成后,调用close关闭socket创建的套接字描述字

服务器端在通信过程中执行的接口分别为,socket,bind,listen,accept,read,write,close;客户端在通信过程中分别调用的接口为socket,connect,write,read,close。

下面我们来详细说一说通信过程中用到的这些接口及其功能:

socket:创建套接口描述字(套接字)

头文件:#include <sys/socket.h>

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

返回值:成功:非负描述字,失败:-1
参数说明:

family:协议簇选项,当前套接口的协议类型。图2解释了不同值代表的意义

type:常用类型,TCP一般为字节流套接口,UDP一般为数据报套接口,如下图3

protocol:协议号,通常设置为0,但在原始套接口上可能会有不同。

 

                                    图2

                                       图3

family&type组合成的协议类型如下图4,从图中我们可以看出TCP都是字节流型的报文,UDP都是数据报类型的报文

                                         图4

 

connect:客户端用来建立与服务器的连接

头文件:#include <sys/socket.h>

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

返回值:成功:0 错误:-1
参数说明:

sockfd:套接口描述字,客户端socket函数创建的套接字

servaddr:套接口地址结构指针,其内部必须包含服务器的IP地址和端口号

addrlen:套接口地址结构大小

延伸:在TCP连接过程中,connect函数激发TCP的三路握手过程,且仅在连接建立成功或出错时才返回,返回的错误可能有以下几种情况:

  1. tcp客户没有收到SYN分节的响应,则返回ETIMEDOUT。
  2. 客户接受到RST响应,则表明该服务器主机在我们指定的端口上没有进程与之连接。
  3. 如果某客户发出的SYN在中间的路由器上引发了一个目的地不可达ICMP错误。客户保存此消息,并按一定的时间间隔连续发出SYN。若在规定时间后仍未收到响应
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您解答关于C#网络编程Socket Tcp的异步循环接收客户端连接和信息的问题。 在Socket Tcp编程中,异步循环接收客户端连接和信息是一种常见的编程模式,可以有效地提高程序的并发性能和可靠性。下面是一个简单的实现方式: 首先,我们需要创建一个TcpListener对象,并绑定监听的IP地址和端口号: ```csharp TcpListener listener = new TcpListener(IPAddress.Any, 8888); listener.Start(); ``` 然后,我们可以使用异步方式接收客户端的连接请求: ```csharp listener.BeginAcceptTcpClient(new AsyncCallback(AcceptCallback), listener); ``` 其中,AcceptCallback是一个回调函数,用于处理客户端连接的请求,可以在该函数中创建一个新的TcpClient对象,并使用异步方式接收客户端发送的数据。 在AcceptCallback函数中,我们可以使用异步方式接收客户端发送的数据: ```csharp TcpClient client = listener.EndAcceptTcpClient(ar); NetworkStream stream = client.GetStream(); byte[] buffer = new byte[4096]; stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReadCallback), buffer); ``` 其中,ReadCallback是一个回调函数,用于处理客户端发送的数据,可以在该函数中解析并处理客户端发送的数据。 最后,在ReadCallback函数中,我们可以使用异步方式持续接收客户端发送的数据: ```csharp stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReadCallback), buffer); ``` 以上就是使用异步循环接收客户端连接和信息的基本实现方式。需要注意的是,在实现过程中,我们需要考虑多线程安全和异常处理等问题,以确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值