gpt4 book ai didi

c - 调用recv()后总线错误/如何接收chunked压缩数据

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:01 26 4
gpt4 key购买 nike

您好,我有一个简单的浏览器,它向 yahoo.com 发送请求,服务器响应告诉我 200 Ok,它会使用 encoded-transfer:chunked 向我发送一个 gzip 文件。这很好,但当我运行我的程序并不断调用 recv() 时,我最终遇到了总线错误。我现在不确定这意味着什么。此外,我不清楚如何读取数据包的 header 以告诉我它将发送多少字节,因为压缩文件是机器代码。在这个问题中,我在我的代码下方以及我在终端中看到的输出中包含了正确的内容。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

#define MAXDATASIZE 500;

int main(int argc, char *argv[]){
struct addrinfo serverSide,*serverInfo;
int mySock, status;
char buf[501],ipstr[INET6_ADDRSTRLEN];

memset(&serverSide, 0, sizeof serverSide);
serverSide.ai_family = AF_UNSPEC;
serverSide.ai_socktype = SOCK_STREAM;

if(getaddrinfo("www.yahoo.com","80",&serverSide,&serverInfo)==0){

}

mySock = socket(serverInfo->ai_family, serverInfo->ai_socktype, serverInfo->ai_protocol);
connect(mySock, serverInfo->ai_addr, serverInfo->ai_addrlen);

char msg[500] = "GET http://www.yahoo.com HTTP/1.1\r\n";
strcat(msg,"Host: www.yahoo.com:80\r\n");
strcat(msg,"User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n");
strcat(msg,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
strcat(msg,"Accept-Language: en-us,en;q=0.5\r\n");
strcat(msg,"Accept-Encoding: gzip, deflate\r\n");
strcat(msg,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n");
strcat(msg,"Connection: keep-alive\r\n\r\n");

// I want to keep the code simple so I just call recv enough times to see what has been
// written to my buffer. If I could read the packet length in the header then I would
// code in a while loop to adjust for that.
if((status = send(mySock,msg,strlen(msg),0))== -1){
printf("request not sent %d\n",status);
perror("\n");
}else{
if((status = recv(mySock, buf, 1500, 0))== -1){
printf("recieved byte error");
}else{
printf("%s",buf);
}
if((status = recv(mySock, buf, 1500, 0))== -1){
printf("recieved byte error");
}else{
printf("%s",buf);
}
if((status = recv(mySock, buf, 1500, 0))== -1){
printf("recieved byte error");
}else{
printf("%s",buf);
}
if((status = recv(mySock, buf, 1500, 0))== -1){
printf("recieved byte error");
}else{
printf("%s",buf);
}
}
close(mySock);
freeaddrinfo(serverInfo);
return 0;
}

波纹管是我的代码的输出。服务器响应如下...

HTTP/1.1 200 OK Date: Sat, 21 Jan 2012 08:53:09 GMT Set-Cookie: B=4peq6lh7hkv7l&b=3&s=u4; expires=Tue, 21-Jan-2014 20:00:00 GMT; path=/; domain=.yahoo.com P3P: policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV" Cache-Control: private X-Frame-Options: SAMEORIGIN Set-Cookie: IU=deleted; expires=Fri, 21-Jan-2011 08:53:09 GMT; path=/; domain=.yahoo.com Set-Cookie: PH=deleted; expires=Fri, 21-Jan-2011 08:53:09 GMT; path=/; domain=.yahoo.com Set-Cookie: fpc=d=2BrdHmSMUw00.1uwnK1w8hHJcKnQt3UjRGxvUnBVIn0e6eAyRyd96eAPIN33Jne3IWoEE8r8eAk9xF0ExLsN5JJJmANZRlEBg8hpcDJ1GD7Gd50uZeP1H0_Wbf_mc.LJ45tDfhhwjR1BSedjT7AeGszK321i_gS34xKNuHlH2niKnP1lFG8y3aztEQsOkQHUu1w3zxk-&v=2; expires=Sun, 20-Jan-2013 08:53:10 GMT; path=/; domain=www.yahoo.com Set-Cookie: CH=deleted; expires=Fri, 21-Jan-2011 08:53:09 GMT; path=/; domain=www.yahoo.com Set-Cookie: CH=AgBPGnwQAA9AEAAA3RAAKY0QAAMPEAAYcxAAKN0QAD5XEAASNBAAJeoQACI8; expires=Mon, 20-Feb-2012 08:53:09 GMT; path=/; domain=.yahoo.com Set-Cookie: fpt=d=nZFZlZHXecyEB3UWO0p6uOQtHkIdLjY734kqWOMHwg8Yq1e0sUpJBiMgYN63uaJ0.zEBsZIbeO93bfF0mXfQ8CtJYxAuet8CIS5PYmNMWfBDUU6ew8pXSI6cY3aX7Nk743wzRxbuCoBZGqvOM0eGhQMFOQ7BrCYBAZsAIYAOqwHKu7sNvbkPN7r0T7ncKpu5bX8LWPGngHHS97cCbNgpbgzOh13nP1m6.9cw7oPeudXdRjfzxsDUYqq2LvQJdECPWmccPhDEYfAoIl.Cfc8T8w_5.zrvoWG5kJr_T0megV4GtcTB324ZS2zkf0pi1GiMGYVHxGNh01c04XJnjk5q0ek_Xg�ogaa5oZoyhkMYQLI66nMCt1yAiz1jXmq2MTBxHqtbxBkoJaVsJt0YQMdpkkxwpRpXZHUgur.K9kY4j3vgyG1j44CQPlNsh7mBMxNe5nLdCMjFMy0ufmocRYowg38kMiK9hpFqkFnwYZSZPMGM4wAK5wVvFrwn1phkY3OXr76z5OC5tjNeq3Q--&v=1; path=/; domain=www.yahoo.com Set-Cookie: fpps=deleted; expires=Fri, 21-Jan-2011 08:53:09 GMT; path=/; domain=www.yahoo.com Set-Cookie: fpc_s=d=33OMFTGMUw2Z.oeMhzS8DGMizJ2NFSc4VT5QjW6pM.25xOqOYy5nr_kK5C83.tjkxzIiFvBITPc7P5YBehviyRS3piAAliJxvHQHDlbZYOlAdvgPXzJ4zGghf.xEL6Rb6rVdP90xlOc_njpBqlqOcwyMeq0ZqBy2VXuNrIxiD9QjUUsJyfVJ4miF1frSXQOI5Z8MVIErFoBjW3jTQANFu_CayJrjp6RRDc.YG5DCn04SFk3hKALdzVPSyIoawxmicCoWFfN7dvyge8jRoeQXHey.IALpAtcCPlY4eX.teLb.GO0yQxUN5HzgR9I-&v=2; path=/; domain=www.yahoo.com Vary: Accept-Encoding Content-Type: text/html;charset=utf-8 Content-Encoding: gzip Age: 2 Transfer-Encoding: chunked Connection: keep-alive Server: YTS/1.20.0

000088e ���I�HG8Ae��t�>#%xc�c#���a��e9��*d��S��@�~}�ZF��~x�
6�S8�#ӉO�i:i%��?���a��9rxJ�n���<Q����_�-�A����!D{�{ޱN���f*/h��ΰ ���Ea�h��E��2UY�
2�7�����dL>U���^W˳g��H�Q�>���~����iiΟ��@:���R�L�b��K���=�#
Ғ�5���|'�J��eo
��{� Bus error

最佳答案

char buf[501];
...
recv(mySock, buf, 1500, 0)
^^^^

如果 recv 实际上读取超过 501 个字节,您将溢出您的缓冲区,从而导致未定义的行为。确保您从不读取超过 501 个字节,或增加缓冲区的大小。

printf 也不安全。没有任何东西可以保证输入是正确的、以 0 结尾的 C 字符串。 (您可以使用 write 并传递返回的长度 recv。)

关于c - 调用recv()后总线错误/如何接收chunked压缩数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8951897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com