Jac*_*ack 1 c sockets linux gcc
我有这个简单的C代码,尝试使用80端口连接到www主机.我正常得到http标头响应,但我没有HTML内容,我得到了未知的字符(我打印垃圾吗?)
(facebook.com只是示例,它发生在任何服务器上)检查我的代码:
#define BUF_SIZE 4096
struct sockaddr_in sockaddr;
struct hostent *host;
char buffer[BUF_SIZE] = { 0 };
int sock;
static const char const headers[] =
"GET / HTTP/1.1\r\n"
"Host:www.facebook.com\r\n"
"User-Agent:Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n"
"Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Accept-Encoding:gzip,deflate\r\n"
"Connection:close\r\n"
"\r\n\r\n";
if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
perror("Cannot create TCP socket");
exit(1);
}
if((host = gethostbyname("www.facebook.com")) == NULL) {
perror("Cannot get host");
exit(1);
}
memset(&sockaddr, 0, sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
memcpy(&sockaddr.sin_addr,
host -> h_addr_list[0],
(size_t) host -> h_length);
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(80);
if(connect(sock, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr)) == -1) {
perror("cannot connect");
exit(1);
}
if(send(sock, headers, strlen(headers), 0) == -1) {
perror("Cannot send packet");
exit(1);
}
ssize_t readed;
while((readed = recv(sock, buffer, BUF_SIZE, 0)) > 0) {
write(fileno(stdout), buffer, readed);
memset(buffer, 0, readed);
}
close(sock);
Run Code Online (Sandbox Code Playgroud)
回复示例:
HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, must-revalidate
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"
Pragma: no-cache
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Set-Cookie: datr=7HVjUC3-OlTdOMH3HivA_8Ge; expires=Fri, 26-Sep-2014 21:38:52 GMT; path=/; domain=.facebook.com; httponly
Set-Cookie: reg_ext_ref=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.facebook.com
Set-Cookie: reg_fb_gate=http%3A%2F%2Fwww.facebook.com%2F; path=/; domain=.facebook.com
Set-Cookie: reg_fb_ref=http%3A%2F%2Fwww.facebook.com%2F; path=/; domain=.facebook.com
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-FB-Debug: 36+IohXvxWRp+3LHt+aLebawuS3W/MaBkmgR9TJGMrk=
Date: Wed, 26 Sep 2012 21:38:52 GMT
Transfer-Encoding: chunked
Connection: close
2f03
?}Yo?X??{?
?S-U)???P!????V??2?
F?A?AFr -9
?
??0?p?{?1cx??1`???????0m? ?
?\??XH)3U?v??yy???{??g?O??:?l_?lKoh?????L??7??'K??{jW????,uM?ue+??L?uU[:?=U?T????{?LM???O?c????ou=ö$???;XR??G;K]?e;Kc?4?$u??Z{?P?c???[?6,?^u?w?????????K??m??v????A???v!?pm?m?W???'?A???k??q?????????Z?g???#?+???\??tU???????*s?V??7??W??[???????????xO??uM??jZ???ptR????Z5qv?QO???ww???5K7?????Mg?c^?C+h??M<;V????e???P?1???w???????~w~???????ky?U????X?????UTk\?Xw?'?b?V\????<??????b???z*?'%????[od??]?H??W????F??q? ??M?<?n?Owl)?>?fK?R~E?
??
[...]
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
删除行:
"Accept-Encoding:gzip,deflate\r\n"
Run Code Online (Sandbox Code Playgroud)
因为它告诉远程主机yoz接受压缩数据,你不要!
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |