Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何处理来自服务器的分块响应?_C_Http_Network Programming_Chunked Encoding - Fatal编程技术网

C 如何处理来自服务器的分块响应?

C 如何处理来自服务器的分块响应?,c,http,network-programming,chunked-encoding,C,Http,Network Programming,Chunked Encoding,我正处在用C编写基本代理服务器的最后一个主要障碍上 我已经让我的服务器成功地从浏览器接收请求,然后成功地将它们发送到主机,无论它们在哪里。我成功地收到了主持人的回复!除此之外,当我尝试通过服务器连接到Google时,我得到以下信息: Rcvd message from server: ---- HTTP/1.1 200 OK Date: Thu, 15 Mar 2012 20:35:11 GMT Expires: -1 Cache-Control: private, max-age=0 C

我正处在用C编写基本代理服务器的最后一个主要障碍上

我已经让我的服务器成功地从浏览器接收请求,然后成功地将它们发送到主机,无论它们在哪里。我成功地收到了主持人的回复!除此之外,当我尝试通过服务器连接到Google时,我得到以下信息:

Rcvd message from server: 

----

HTTP/1.1 200 OK
Date: Thu, 15 Mar 2012 20:35:11 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=83a7c2e6675a9a9f:FF=0:TM=1331843711:LM=1331843711:S=7I7RIVV1B-HxhWJR; expires=Sat, 15-Mar-2014 20:35:11 GMT; path=/; domain=.google.com
Set-Cookie: NID=57=KvqnXtYNkJZBryXL5zzhG5eH8Or2_PDWDqT_kU35PvOro_mAFiLiTSjPHOnWWxxm3R0vKYnzEeVkAPFKK366lZiNZGpjhO2-II5OeZQnWe09H-jZdePsrN-SnBdQ2ENT; expires=Fri, 14-Sep-2012 20:35:11 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked

1000
<!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta name="description" content="Search the world&#39;s information, including webpages, images, videos and more. Goo
来自服务器的Rcvd消息: ---- HTTP/1.1200ok 日期:2012年3月15日星期四20:35:11 GMT 过期:-1 缓存控制:专用,最大年龄=0 内容类型:text/html;字符集=UTF-8 设置Cookie:PREF=ID=83a7c2e6675a9a9f:FF=0:TM=1331843711:LM=1331843711:S=7i7riv1b HxhWJR;expires=2014年3月15日星期六20:35:11 GMT;路径=/;域名=.google.com 设置Cookie:NID=57=KvqnXtYNkJZBryXL5zzhG5eH8Or2_PDWDqT_kU35PvOro_mafilitsjphonwwxxm3r0vkynzeevkapfk366lzinzgpjho2-II5OeZQnWe09H-jZdePsrN-snbdqent;expires=2012年9月14日星期五20:35:11 GMT;路径=/;域名=.google.com;HttpOnly P3P:CP=“这不是P3P策略!请参阅http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 有关详细信息,请参阅。“ 服务器:gws X-XSS-Protection:1;模式=块 X-Frame-Options:SAMEORIGIN 传输编码:分块 1000
您不能使用strlen获取缓冲区的大小,strlen仅用于获取字符串的大小,您可能正在读取一些二进制数据,因为不仅仅是文本通过您的代理(图像…)。尝试使用read返回的值,即实际读取的字节数


以“\n”结尾的字符串将变得毫无用处。

你能详细说明一下你是怎么做的(放置相关的C代码),为什么说它被剪切了吗?我可以附加一些代码,但我一直在编辑它,试图自己解决它,而且我还没有测试它,所以现在我还不知道它会做什么。需要一些时间。我想如果你向右滚动,你会看到截止期——显然Google.com的代码不止这些。它只停留在元标签的中间。“还有很多呢!”Aerovistae,你是如何用内容长度来回答的?对不起,你能详细说明一下这个问题吗?我知道你要去哪里,但我不确定如何使用内容长度。它是否真的像只读取内容长度标题所说的那么简单,然后停止读取?对于图像(通常是二进制数据),不要使用NUL terminate
buffer2
,而使用仅适用于文本数据的
strlen
。在所有情况下,只需使用
n
作为发送数据的长度。(当
n
is为1024时,NUL终止
buffer2
也会超出数组的末尾。)但是块是文本和图像的混合体,不是吗?我应该永远不使用null终止,还是会导致文本部分出错?你没有理由使用null终止问题在于你的推理好像它是c sting,而不是原始数据。因此,在数据的中间,可能会得到一个等于0的字节。这就是你的斯特伦不工作的原因。不要认为这是文本和图像,而是数据。所以没有理由空终止在字符数组中保存原始数据可以吗?我不知道该把它放在什么样的变量里。是的,它很好。不要把char看作一个字符,而是一个1字节的数据容器。如果你还没有这样做,试着在文本编辑器中打开一个二进制文件,你会发现即使它对人类来说是完全不可读的,它也可以正常工作。
/*WRITING SERVER RESPONSE TO CLIENT*/

  char buffer2[1024];

  n = read(sock, buffer2, 1024 );

  if ( n < 1 )
  {
    perror( "read() failed" );
    return EXIT_FAILURE;
  }

  else
  {
    buffer2[n] = '\0';
    printf( "Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2 );
  }

  n = write( newsock, buffer2, strlen( buffer2 ) );

  while((n = read(sock, buffer2, 1024 )) >= 1)
  {
      buffer2[n] = '\0';
      printf( "Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2 );
      n = write( newsock, buffer2, strlen( buffer2 ) );
  }