免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5981 | 回复: 23
打印 上一主题 下一主题

一个网络编程中send的菜鸟问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-26 16:14 |只看该作者 |正序浏览
刚接触linux网络编程,碰到一些烦人的小问题,比如说写一个测试程序,写了一个客户端和服务器端的程序,实现功能很简单,客户端发送一个字符串给服务器断,服务器断将这个字符串处理一下然后返回给客户端,在我建立了连接之后在客户端用send()之后发现服务器断接收不到字符串,后来测试了半天我在send之后马上关掉连接的socket文件sockfd服务器端马上就收到了,我想问一下是不是每次send之后一定要关掉连接的sockfd才能再服务器端才能接收到客户端发送的字符串的??如果是这样我要再后面的程序中接收来自服务器端回送的字符串之后应该怎么办呢?总不能说我重新建立一个连接吧.......郁闷中.

论坛徽章:
0
24 [报告]
发表于 2006-12-27 10:46 |只看该作者
原帖由 pineapple1175 于 2006-12-26 22:26 发表
才出去看了两个小时的书就有这么多回帖了,真是感激啊,再这之前的另外一个帖子上发了半天到现在也没人来理我
我去试了一下把while循环去掉直接send了一下就直接用recv接收就能正常运行了,不过apue2上面也明确说 ...



接着往下看那本书
后面应该就讲了如何读取或者发送一段期望长度的数据

论坛徽章:
0
23 [报告]
发表于 2006-12-26 22:42 |只看该作者
原帖由 linyue 于 2006-12-26 20:30 发表
我晕,你server的程序里那个getbuf函数里有个while循环不停recv,而你用的又是阻塞模式,所以你收到第一个字符串"hellp"以后,recv又阻塞在while那儿了,当然看上去就跟没受到东西一样了,其实已经收到 ...


用了recv第一次接收了5个字节之后第二次还会接收时返回值还会>0吗??如果是的话就代表还有数据可以接收啊?这和blocking状态有关??

论坛徽章:
0
22 [报告]
发表于 2006-12-26 22:33 |只看该作者
原帖由 linyue 于 2006-12-26 20:30 发表
我晕,你server的程序里那个getbuf函数里有个while循环不停recv,而你用的又是阻塞模式,所以你收到第一个字符串"hellp"以后,recv又阻塞在while那儿了,当然看上去就跟没受到东西一样了,其实已经收到 ...


哈哈,其实我原本来是没用fflush的因为刚看了书说用这函数能把缓冲里的数据送到kernal里面,一开始以为数据没真正发送出去,于是就用了,至于warning当时看到了,但没心情卡管那个了,^_^

论坛徽章:
0
21 [报告]
发表于 2006-12-26 22:27 |只看该作者
真感谢大家的回复,受益非浅啊,谢谢谢谢

论坛徽章:
0
20 [报告]
发表于 2006-12-26 22:26 |只看该作者

回复 6楼 linyue 的帖子

才出去看了两个小时的书就有这么多回帖了,真是感激啊,再这之前的另外一个帖子上发了半天到现在也没人来理我
我去试了一下把while循环去掉直接send了一下就直接用recv接收就能正常运行了,不过apue2上面也明确说了: Since we're using a SOCK_STREAM socket, we can't be guaranteed that we will read the entire string in one call to recv, so we need to repeat the call until it returns 0.我那段while循环也是参照apue2上面的,假如我发送比较多的内容的话还是要用这种模式来接收的,还有就是nonblocking这种状态和blocking这种状态到底有什么区别??如果我非要用while循环接收那么代码要怎么改呢???

论坛徽章:
0
19 [报告]
发表于 2006-12-26 21:38 |只看该作者
原帖由 cjaizss 于 2006-12-26 21:35 发表
阻塞的read(recv同理)不一定每次都会返回所希望读到的字节数,然而对与 TCP,阻塞I/O时没有数据可读是不可返回的,除非对方主动关闭返回0。偶有的时候写设备驱动的时候read返回0不代表任何意思,只代表当前没有数据。然而对于TCP的这些I/O是一个标准  


对 socket descriptors 进行 close(),只是半关闭。返回 0,代表 EOF。两者联系起来,就不难理解了。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
18 [报告]
发表于 2006-12-26 21:35 |只看该作者
阻塞的read(recv同理)不一定每次都会返回所希望读到的字节数,然而对与TCP,阻塞I/O时没有数据可读是不可返回的,除非对方主动关闭返回0。偶有的时候写设备驱动的时候read返回0不代表任何意思,只代表当前没有数据。然而对于TCP的这些I/O是一个标准

论坛徽章:
0
17 [报告]
发表于 2006-12-26 21:28 |只看该作者
recv(2):

     If no messages are available at the socket, the receive call waits for a
     message to arrive, unless the socket is nonblocking (see fcntl(2))  in
     which case the value -1 is returned and the external variable errno set
     to EAGAIN.
The receive calls normally return any data available, up to
     the requested amount, rather than waiting for receipt of the full amount
     requested; this behavior is affected by the socket-level options
     SO_RCVLOWAT and SO_RCVTIMEO described in getsockopt(2).


这段文字,前一部分是楼主问题所在,后一部分是 15 楼 linyue 指出的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
16 [报告]
发表于 2006-12-26 21:25 |只看该作者
哎,我脑子也进水了....
描述错误
人家发了5个字节在那里。
然后自己就recv返回了,然后人家再就没发数据了。
此时协议栈内缓冲区里已经没有数据了,但是人家又没有关闭,recv不好返回。终于人家关闭了连接,recv终于好返回了0代表人家已经关闭连接
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP