关于sock通信之知乎问答


“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。
1.同步与异步
同步和异步关注的是 消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。

而异步则是相反, *调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

典型的异步编程模型比如Node.js

举个通俗的例子:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

2. 阻塞与非阻塞
阻塞和非阻塞关注的是 程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

还是上面的例子,
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

Linux下的socket通信是一种用于在不同计算机之间进行通信的技术。它允许两个或多个进程通过网络进行数据交换。 举一个简单的Linux sock通信案例来说明。假设我们有两台计算机:主机A和主机B。主机A上有一个服务端程序,主机B上有一个客户端程序。服务端程序监听一个指定的端口号,等待客户端连接。客户端程序连接到服务端并发送一条消息。 步骤如下: 1. 在主机A上,我们需要创建一个服务端程序。首先,我们需要使用socket()函数创建一个套接字。然后,我们使用bind()函数将套接字与一个IP地址和端口号绑定。接下来,我们使用listen()函数监听该端口,等待连接请求。一旦有连接请求到达,我们使用accept()函数接受连接,并返回一个新的套接字用于与客户端通信。最后,我们使用recv()函数接收客户端发送的数据,并使用send()函数发送响应数据。 2. 在主机B上,我们需要创建一个客户端程序。首先,我们也需要使用socket()函数创建一个套接字。然后,我们使用connect()函数连接到主机A的IP地址和端口号。一旦连接建立,我们使用send()函数发送一条消息给服务端。接下来,我们使用recv()函数接收服务端的响应。 通过上述步骤,我们实现了主机A和主机B之间的sock通信。服务端程序可以接受来自客户端的请求并响应,而客户端程序可以与服务端进行交互。 这只是一个简单的例子,真实的sock通信可能涉及更复杂的操作和协议。然而,Linux提供了丰富的套接字API,使得开发sock通信变得相对容易。利用sock通信,我们可以构建各种各样的网络应用,如网页服务器、聊天室等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值