在非阻塞模式上怎么知道recv接收数据完成?

797科技网 0 2024-08-22 12:42

一、在非阻塞模式上怎么知道recv接收数据完成?

以linux下 tcp socket编程为例:阻塞就是 recv/read的时候 socket接收缓冲区要是有数据就读, 没数据我就一直睡觉赖着不走,直到有数据来了读完我才走。

send/write的时候,要是发送缓冲区满了,没有空间继续发送了我也一直睡觉赖着不走,直到发送缓冲区腾出足够的空间让我把数据全部塞到发送缓冲区里我才走。

(当然如果你通过setsockopt设置了读写超时,超时时间到了还是会返回-1和EAGAIN,不再睡觉等待)

非阻塞就是recv/read的时候,要是接收缓冲区有数据我就读完,没有数据我直接带着返回的-1和EGAIN走人,绝不睡觉等待耽误时间。

write/send的时候, 要是发送缓冲区有足够的空间,就立刻把数据塞到发送缓冲区去,然后走人,如果发送缓存区满了,空间不足,那直接带着返回的-1和EAGAIN走人。至于IO多路复用,首先要理解的是,操作系统为你提供了一个功能,当你的某个socket接收缓存区有数据可读,或者发送缓冲区有空间可写的时候,它可以给你一个通知。

这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1和EAGAIN的无用功。

写操作类似。

操作系统的这个功能通过select/poll/epoll之类的系统调用函数来使用,这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程。至于事件驱动,其实是I/O多路复用的一个另外的称呼。至于异步同步,我们常见的linux下的网络编程模型大部分都是同步io,以读操作为例,本质上都是需要用户调用read/recv去从内核缓冲区把数据读完再处理业务逻辑。

异步io则是内核已经把数据读好了,用户直接处理逻辑。

异步IO在linux下一般是用aio库。

二、一个客户端socket多线程请求数据,recv时数据混乱?

之所以接收数据时发生混乱,是因为,不能通过收到的数据分辨出它是哪个请求对应数据。

处理这类需要在同一个“通道”(socket) 请求不同服务的问题时,一个常见的做法是,在返回的数据中标识出这个数据对应的请求是哪个。

比如,req: id->1,返回是 rsp: id->1; req: id->2,返回是: rsp: id->2

然后,客户端根据返回的 id 找到对应的请求,就可以区分出数据,就不会混乱了。

加锁只是保证同一时间socket 只处理一个请求,不能保证客户端能够正确区分出请求对应的返回数据。

三、php接受小程序数据

php $name = $_POST['name']; $age = $_POST['age'];

四、servlet怎么接受form表单数据?

关于servlet接受form表单数据,以下方式供参考:

首先jsp页面提交数据, servlet接收前台提交上来的数据,方式如下:

String userName = request.getParameter("userName");

五、川大接受英语专业接受跨考吗?

有点意思,你是英语专业跨考到其他专业,还是非英语专业跨考到英语专业呢?

川大英语专业,特别是翻译方向的专硕,很多跨考过来的,导师非常欣赏英语好而且又有自己专业背景的同学,加上翻译专硕又不考二外,就更受非英语专业同学欢迎了。

不过进来之后一般要考过英语专业八级,CATTI的口译或者笔译相应级别的证书。

英语专业跨考到其他专业的也很多,特别是川大文新学院的比较文学,很多都是外语学院考过来的,没有歧视。祝好! 加油!

六、数据开了为什么接受不到QQ消息?

是不是在设置里不允许QQ使用数据,或者是QQ里设置成了2G/3G下不接受消息

七、如何用mfc编写软件接受串口数据?

其实串口通信挺简单的,就那么几个API,打开串口使用CreateFile,设置串口使用SetCommState,像文件一样进行读写,看一下MSDN就明白了。

八、苏大接受外校调剂么?

1、苏州大学2015年考研学硕国贸专业有调剂名额,接收调剂生。

2、 苏州大学 2015年硕士研究生入学考试拟录取名单已经确定,现进行公示,公示期为10个工作日,考生可以到学校官网查询录取名单。

如有异议请与研究生招生办公室联系。

九、大镖客2怎么接受舞女?

在《荒野大镖客2》中玩家是无法接受酒馆里女的请求的。

而我们的主角面对酒馆中妹子的提问只有拒绝,是没有任何可以深入的选项的。

我们能感受到制作方为了塑造主角的专一而下足了功夫,所以大家也不用再考虑如何在《荒野大镖客2》中如何接受妹子的问题了。

十、数据包里的发送与接受数据是什么意思?

发送和接受指通过你的这个网卡发送出去的数据的“量” 单位有比特、字节和数据包 一般来讲发送少于接收,因为大家上网大多接收的信息比较多。

而发送的比较少。有时候你没打开任何网站也会有数据发送和接受。

大数据时代书籍?
12320免费咨询?
相关文章