首页 > 试题广场 >

调用recv(int sockfd, void *buf,

[单选题]
调用recv(int sockfd, void *buf, size_t len, int flags)的过程中,一共进行了几次内存复制操作?
  • 1
  • 2
  • 3
  • 4
内核从对端接受数据,放在socket的缓存中,然后复制到应用层的buffer,所以一共两个buffer
发表于 2015-08-19 22:49:31 回复(0)
给你们安排明白,点个👍
1.首先知道网卡接收数据,(计算机结构我就省略了,说不完),网卡收到网线传来的数据之后,经过硬件电路传输,会将数据写入内存的某个地址上。(这之间会涉及DMA、IO通路选择等知识)。这一步不重要,需要知道网卡会把数据写入内存即可。(理解为内核缓冲区)
2.网卡向CPU发出中断信号,通知系统有新数据到来。CPU执行中断程序,将之前写入内存的数据写入对应的socket的接收缓冲区里。
3.唤醒阻塞在recv上的进程,recv将socket的接收缓冲区内数据拷贝到用户定义的缓冲区buf中。

在内存上的复制操作应该是指:内核缓冲区->socket接收缓冲区->用户定义的buf缓冲区。
发表于 2020-07-12 00:12:18 回复(1)
recv 接受对端socket数据,经过两次系统调用,首先在内核中将数据拷贝到自己的协议栈;然后recv返回将数据从内核缓冲区拷贝到用户buffer中。 内核从对端接受数据,放在socket的缓存中,然后复制到应用层的buffer,所以一共两个buffer
编辑于 2018-04-19 02:08:29 回复(1)
xxj头像 xxj
B:recv是流式的,其返回长度不固定。故内部需要有一个反冲buf
发表于 2015-01-28 15:37:12 回复(1)
进程到内核
内核到进程
发表于 2017-02-26 23:41:19 回复(0)
recv 接受对端socket数据,经过两次系统调用,首先在内核中将数据拷贝到自己的协议栈;然后recv返回将数据从内核缓冲区拷贝到用户buffer中
编辑于 2017-11-10 17:02:25 回复(0)
**我只选了一次,如果是两次的的话只能是网卡驱动设备把数据从网卡拷贝到内核中了,其实这个不调用recv都会自动完成
发表于 2017-06-21 08:30:53 回复(0)
这题。。函数参数入栈算不算内存复制了
发表于 2023-08-15 13:08:53 回复(0)
内核缓冲区到socket缓冲区,再到buffer缓冲区
发表于 2023-07-26 20:28:54 回复(0)
求解
发表于 2022-07-12 15:37:51 回复(0)
内核从对端接受数据,放在socket的缓存中,然后复制到应用层的buffer,所以一共两个buffer
发表于 2021-05-19 08:57:21 回复(0)

功能:不论是客户还是服务器应用程序都用recv()函数从TCP连接的另一端接收数据。

  • 参数一:指定接收端套接字描述符;

  • 参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

  • 参数三:指明buf的长度;

  • 参数四 :一般置为0。
    阻塞与非阻塞recv返回值没有区分,都是

    > 0 成功接收数据大小。

    = 0 另外一端关闭了套接字

    = -1 错误,需要获取错误码errno

发表于 2018-10-22 16:19:15 回复(0)
不太懂。。。
发表于 2017-10-09 21:15:08 回复(0)
疑问:
    是协议接收数据的时候算一次,然后recv复制协议接收到的数据又算一次吗?
发表于 2016-08-13 11:32:57 回复(0)
没懂  求大神解释一下
发表于 2015-07-12 20:19:54 回复(0)