免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9409 | 回复: 7
打印 上一主题 下一主题

[C] linux下socket编程 接收post数据问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-20 12:38 |显示全部楼层 |倒序浏览
用c语言写了个http服务器,在用recv函数接受浏览器传递过来的post数据时,发现recv会停止在消息头与空行处(post数据格式是 头 空行 数据)。试过用read函数来接收,同样不行。
下面使我的recv函数调用代码:
  1. if((cnt=recv(i,recvbuf,sizeof(recvbuf),0))<=0){//read the first line
  2.                                                        
  3.         //client disconnect
  4.         printf("\nclient[%s] [fd:%d] disconnect\n",inet_ntoa(clientaddr.sin_addr),i);
  5.         fd_clear(i,&fdread);
  6.         fdcnt--;
  7.         close(i);
  8.         settaskstate(i-3,0,0);
复制代码
运行结果图:

在最后空行会阻塞。
谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-05-21 11:37 |显示全部楼层
发截图的人不知道都是基于怎样的一种心理呢?
flw 发表于 2010-05-20 13:18



     不知你啥意思???

论坛徽章:
0
3 [报告]
发表于 2010-05-21 11:49 |显示全部楼层
我最近自己也在自己试着写一些这方面的代码,不过我想实现那种能够实时反馈上传了多少数据那种功能,不知道 ...
hobbs136 发表于 2010-05-20 13:05



     如果是自己编写客户端的话, 那应该可以在客户端实现的。但这可能不是很好的,可靠性不是很高,传送大型的数据的话,可能网络拥塞,数据还没有上传到服务器,而你的客户端还在发送并且显示发送了所有的数据的进度。我想,应该最好在客户端和服务器端各开启的一线程,服务器端线程作为一个监听程序,不断的统计数据接收的大小,然后发送回客户端。客户端线程接收反馈信息。呵呵,我也不是很清楚,也没用c玩过这些,不过可以在我的程序里实现下,看看效果。

论坛徽章:
0
4 [报告]
发表于 2010-05-21 11:53 |显示全部楼层
我的意思,就是想做个心理访谈。
请问,你发截图,而不发文字,是出于怎样的一种考虑?


稍微解释一 ...
flw 发表于 2010-05-21 11:41



    哦。这样啊。呵呵。发截图是因为我担心自己描述不清楚,别人看不懂才发截图的,毕竟人对图更容易接受。还有,具体的http数据传输协议有些人是不知道的,发个图也许能更好的理解

论坛徽章:
0
5 [报告]
发表于 2010-05-21 12:51 |显示全部楼层
但是你的图上也只有文字没有别的说不清楚的地方啊。
除了文字之外,还有就是颜色,可我一直认为这是把自 ...
flw 发表于 2010-05-21 12:04



    哈哈。我觉得啊,你这问题可以告诉下chinaunix论坛开发人员,干脆把截图功能给删了。咱们就不讨论什么技术问题了,按照你的说法,我以后不看书了,为啥了???很简单,有时,我不认同作者画的图,他画的太难看了。哎,算了,把书丢掉把。在linux的国度里,我们崇尚自由,可是,为了自由,我们不去关注别人的问题,不去学习那些问题,而是去思考别人是否给自己强加了某些思想。哇塞,可以自比为“思想圣人”了。。。还有,我不是非常喜欢chinaunix某些页面布局,还有很垃圾的博客系统,那我是不是应该不上chinaunix了。你说的也有道理,本应该可以用文字描述的问题,应该用文字描述,看来本人还是有些懒惰啊。顺便说一句哈,本人语文成绩蝉联不及格的水平,说话不好还请见谅。
   还有,你能解决我的问题吗?学习完网络课程后,想弄http服务器玩玩。
   谢谢。下次发帖一定谨记您的真言。

论坛徽章:
0
6 [报告]
发表于 2010-05-28 16:38 |显示全部楼层
sizeof(recvbuf)是多大?
wenjianhn 发表于 2010-05-28 10:49



    我的recvbuf设的1024字节

论坛徽章:
0
7 [报告]
发表于 2010-05-28 17:19 |显示全部楼层
第一要反复读

第二 http head 后面跟一个\r\n\r\n 是结束符。以后就是数据了, 读取的长度 就是 length  ...
benjiam 发表于 2010-05-28 17:03



    你只要看第一行就是了。一个recv函数。 我的程序就是停止在接受数据的空行处。老师跟我讲url head头 和数据是一起发送过来的,那我接受也应该是一次全部接收下来的啊。

论坛徽章:
0
8 [报告]
发表于 2010-05-29 12:19 |显示全部楼层
http是TCP链接吧,你的recv这样用,如果数据不够sizeof(recvbuf),应该是会阻塞的,除非浏览器自动关闭链接 ...
xiexiecn 发表于 2010-05-28 18:23



    能具体点吗?你的意思是说我的recvbuf大小要和接收的数据大小一样大?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP