首页 > 试题广场 >

在linux网络编程中,以下关于socket描述符正确的是:

[不定项选择题]
在linux网络编程中,以下关于socket描述符正确的是:
  • socket存在两种模式:阻塞和非阻塞
  • 系统调用read从socket中读取数据时,当read返回-1的时候,表示socket中数据读取完毕
  • 如果socket设置成非阻塞模式,当socket的输入缓冲区没有可读数据时,read操作会返回错误
  • 在阻塞socket上调用write函数发送数据,函数返回时,表示数据已经发送出去
但是说的是阻塞模式,阻塞不到write函数本身的运行?
发表于 2016-01-15 12:23:20 回复(0)
socket调用write发生错误是也会返回,但是返回的是-1。所以不是返回了就代表数据已经发出去了。。。。
发表于 2015-11-30 14:20:16 回复(1)
我觉得答案是AC.
B:非阻塞模式下,返回0表示对端发送close关闭连接;所以我觉得这个也不一定正确。
C:正确.非阻塞模式下,如果缓冲区为空,那么read返回-1,同时设置errno=EAGAIN。
D:非阻塞模式下,表示写入内核socket缓冲区;阻塞模式下表示成功发送出去。
编辑于 2016-05-15 18:57:09 回复(2)
阻塞模式发送成功并接受才会返回;非阻塞模式发送后立即返回。 非阻塞模式下如果缓冲区没内容,表示没数据可读取,立即返回非0。 阻塞模式下,write有返回时未必发送成功,也可能是错误。
发表于 2018-09-26 21:21:09 回复(0)

从写一个TCP套接字的write调用成功返回仅仅表示我们可以重新使用原来的应用进程缓冲区,并不代表对端TCP或应用进程已接收到数据。

对端TCP必须确认收到的数据,伴随来自对端的ACK的不断到达,本端TCP至此才能从套接字发送缓冲区中丢弃已确认的数据,TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。

UDP不保存应用进程数据的副本因此无需一个真正的发送缓冲区,write调用成功返回表示所写的数据报或其所有分片已被加入数据链路层的输出队列。

对于read调用(套接字标志为阻塞),如果接收缓冲区中有20字节,请求读100个字节,就会返回20。对于write调用(套接 字标志为阻塞),如果请求写100个字节,而发送缓冲区中只有20个字节的空闲位置,那么write会阻塞,直到把100个字节全部交给发送缓冲区才返 回,如果write中得套接字标志为非阻塞,则直接返回20,因此我们可以实现自己的readn和writen函数。

每个TCP套接字都有一个发送缓冲区和一个接收缓冲区,每个UDP套接字都有一个接收缓冲区;
http://www.tuicool.com/articles/FRVJj2
http://blog.csdn.net/hguisu/article/details/7453390

发表于 2016-08-22 13:57:23 回复(0)

怎样理解阻塞非阻塞与同步异步的区别


发表于 2018-12-06 13:41:37 回复(1)
AC正确
socket存在两种模式:阻塞和非阻塞 正确
系统调用read从socket中读取数据时,当read返回0的时候,表示socket中数据读取完毕 错误,返回0表示对端已关闭
如果socket设置成非阻塞模式,当socket的输入缓冲区没有可读数据时,read操作会返回错误
正确 非阻塞时没有数据可读read返回-1 errno是EAGAIN
在阻塞socket上调用write函数发送数据,函数返回时,表示数据已经发送出去 错误,write表示数据已写入TCP发送缓冲区,并不是已经将数据发送
编辑于 2020-07-21 15:43:18 回复(0)
返回0表示EOF,就是没有数据可读了。
write返回成功不保证数据发出去,估计说的是可能数据还在网卡缓冲区中。
发表于 2016-04-14 21:20:51 回复(0)
答案a,两种模式,阻塞和非阻塞,没问题
答案b,返回值-1,表示出错,0表示读到末尾,正常是返回读到的实际字节数,因此错误
答案c,因为是非阻塞模式,读不到我不等直接报错,正确
答案d,write函数返回,可能是把数据写入发送缓存区,这时还没发送出去,错误
发表于 2022-10-19 08:36:46 回复(1)
read返回0就一定是读取完毕吗?
发表于 2016-02-29 23:33:53 回复(0)
系统调用read从socket中读取数据时,当read返回0的时候返回0表示对端已关闭
发表于 2022-12-14 09:14:28 回复(0)
答案AC,我选了BD,太难受了
发表于 2022-05-20 15:50:05 回复(0)
我选了d🙃
发表于 2021-03-09 15:20:56 回复(0)
完美,我居然只选了C 。你敢信?
发表于 2019-04-17 23:14:37 回复(0)
B有歧义啊,也有可能是关闭end了,没有读取数据?
发表于 2017-11-30 10:42:05 回复(0)
read从socket中读取数据时,read大于0,读取到数据,read等于0,数据读取完毕,read等于-1,出错返回
发表于 2017-08-11 17:49:29 回复(0)
write是没有缓冲的IO,返回时,只是表示把应用层的数据拷贝到内核的缓冲区,并非真正发送出去
发表于 2016-11-26 11:37:55 回复(0)
对B有疑问,返回值为0,只是表示正常关闭,不知道是不是只有数据读取完后关闭,才表示正常关闭
发表于 2016-09-27 21:48:31 回复(0)
B是错的,read返回0表示对方断开了连接
如果是阻塞模式,数据读完了会阻塞
如果是非阻塞模式,我们都是不停的读这个套接字,直到读空了,返回-1
发表于 2016-08-22 23:22:16 回复(0)
read为0是,可能对方已经关闭了socket
发表于 2016-03-27 15:05:12 回复(1)