Chinaunix

标题: linux下socket编程 接收post数据问题 [打印本页]

作者: 古兮之    时间: 2010-05-20 12:38
标题: linux下socket编程 接收post数据问题
用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);
复制代码
运行结果图:

在最后空行会阻塞。
谢谢!
作者: hobbs136    时间: 2010-05-20 13:05
我最近自己也在自己试着写一些这方面的代码,不过我想实现那种能够实时反馈上传了多少数据那种功能,不知道你有任何看法
作者: flw    时间: 2010-05-20 13:18
发截图的人不知道都是基于怎样的一种心理呢?
作者: 古兮之    时间: 2010-05-21 11:37
发截图的人不知道都是基于怎样的一种心理呢?
flw 发表于 2010-05-20 13:18



     不知你啥意思???
作者: flw    时间: 2010-05-21 11:41
不知你啥意思???
古兮之 发表于 2010-05-21 11:37

我的意思,就是想做个心理访谈。
请问,你发截图,而不发文字,是出于怎样的一种考虑?


稍微解释一下,我之所以会有此一问,是因为我一直以来都有一个观点:
在适合发文字的场合,却发了截图,这样的人都是学不成计算机技术的。
我想多收集一些样本来验证一下我这个观点。
作者: 古兮之    时间: 2010-05-21 11:49
我最近自己也在自己试着写一些这方面的代码,不过我想实现那种能够实时反馈上传了多少数据那种功能,不知道 ...
hobbs136 发表于 2010-05-20 13:05



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


   还有很多人喜欢看录像
作者: 古兮之    时间: 2010-05-21 11:53
我的意思,就是想做个心理访谈。
请问,你发截图,而不发文字,是出于怎样的一种考虑?


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



    哦。这样啊。呵呵。发截图是因为我担心自己描述不清楚,别人看不懂才发截图的,毕竟人对图更容易接受。还有,具体的http数据传输协议有些人是不知道的,发个图也许能更好的理解
作者: flw    时间: 2010-05-21 12:04
哦。这样啊。呵呵。发截图是因为我担心自己描述不清楚,别人看不懂才发截图的,毕竟人对图更容易 ...
古兮之 发表于 2010-05-21 11:53

但是你的图上也只有文字没有别的说不清楚的地方啊。
除了文字之外,还有就是颜色,可我一直认为这是把自己的审美观强加到别人身上。
比如有些人可能看到了这个颜色和字体之后就会感觉很不爽。
作者: 古兮之    时间: 2010-05-21 12:51
但是你的图上也只有文字没有别的说不清楚的地方啊。
除了文字之外,还有就是颜色,可我一直认为这是把自 ...
flw 发表于 2010-05-21 12:04



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


我的想法就是和你的想法一样,没有想到要自己写客户端,就是接收普通的浏览器提交过来的数据,这得实时分析http协议,找到文件边界,然后将提交过来的文件数据先写到一个临时文件中,随后提供一个api来获取该临时文件的大小。
作者: hobbs136    时间: 2010-05-23 17:00
用c语言写了个http服务器,在用recv函数接受浏览器传递过来的post数据时,发现recv会停止在消息头与空行处( ...
古兮之 发表于 2010-05-20 12:38



    你贴一下代码看看
作者: wenjianhn    时间: 2010-05-28 10:49
sizeof(recvbuf)是多大?
作者: 古兮之    时间: 2010-05-28 16:38
sizeof(recvbuf)是多大?
wenjianhn 发表于 2010-05-28 10:49



    我的recvbuf设的1024字节
作者: benjiam    时间: 2010-05-28 17:03
第一要反复读

第二 http head 后面跟一个\r\n\r\n 是结束符。以后就是数据了, 读取的长度 就是 length 字段的长度。但是内容可能用了html编码。  

最后 看不懂你写的代码。。。
作者: 古兮之    时间: 2010-05-28 17:19
第一要反复读

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



    你只要看第一行就是了。一个recv函数。 我的程序就是停止在接受数据的空行处。老师跟我讲url head头 和数据是一起发送过来的,那我接受也应该是一次全部接收下来的啊。
作者: xiexiecn    时间: 2010-05-28 18:23
http是TCP链接吧,你的recv这样用,如果数据不够sizeof(recvbuf),应该是会阻塞的,除非浏览器自动关闭链接(俺对http协议不熟悉,大概记得链接是有服务器来关闭的)。
解决办法,可以使用MSG_DONTWAIT标志。或者先用ioctl获取可以读的字节数。
作者: benjiam    时间: 2010-05-28 23:07
你只要看第一行就是了。一个recv函数。 我的程序就是停止在接受数据的空行处。老师跟我讲url hea ...
古兮之 发表于 2010-05-28 17:19


如果你一次也返回不了 那么检查你前面的流程代码吧, 目前我看到的是已经获得到数据了。

客户端是一次送过来的 不意味着你一次recv 就可以获取(虽然基本上一次都能获取到)。
作者: 古兮之    时间: 2010-05-29 12:19
http是TCP链接吧,你的recv这样用,如果数据不够sizeof(recvbuf),应该是会阻塞的,除非浏览器自动关闭链接 ...
xiexiecn 发表于 2010-05-28 18:23



    能具体点吗?你的意思是说我的recvbuf大小要和接收的数据大小一样大?
作者: xiexiecn    时间: 2010-05-29 18:16
恩,或者比它小。因为TCP是面向链接的,和UDP不一样,既然你指定了recv希望接受的字节数,那么只要数据不够并且链接没有关闭,那么recv是会阻塞的。这个和读文件有些不一样,因为文件有个文件尾,当超过了read自然就返回了,socket需要等待对方关闭才行。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2