- 论坛徽章:
- 0
|
下面是我的片断代码,是向某服务器发送数据请求
- #include <sys/socket.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include "zlib.h"
- #include "gzip.h"
- #include "globe.h"
- #define CRAWLER_ERR -1
- #define CRAWLER_SUCCESS 1
- static int channel_list_socket(void)
- {
- int fd; struct sockaddr_in channel_list_addr;
-
- struct hostent * host=NULL; struct timeval tv_out;
-
- tv_out.tv_sec = 10; tv_out.tv_usec = 0;
-
- //char list_ser[40] = "list.pplive.com";
- //char list_ser[40] = "res.pplive.com";
- char list_ser[40] = "vodchannel.pplive.com";
-
- if ((host = gethostbyname(list_ser)) == NULL)
- {
- fprintf(stderr, "gethostbyname() failed: %s\n", strerror(errno));
-
- return CRAWLER_ERR;
- }
-
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- fprintf(stderr, "socket() failed: %s\n", strerror(errno));
-
- return CRAWLER_ERR;
- }
-
- memset(&channel_list_addr, 0, sizeof(channel_list_addr));
-
- channel_list_addr.sin_family = AF_INET;
-
- channel_list_addr.sin_port = htons(80);
-
- //channel_list_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-
- channel_list_addr.sin_addr = *((struct in_addr *)host->h_addr);
- /*
- if ((bind(fd, (struct sockaddr*)&srvaddr, sizeof(srvaddr))) < 0) {
- fprintf(stderr, "bind() failed: %s\n", strerror(errno));
-
- close(fd); return CRAWLER_ERR;
- }
- */
- if(connect(fd, (struct sockaddr *)(&channel_list_addr), sizeof(struct sockaddr)) == -1)
- {
- fprintf(stderr, "connect() failed: %s\n", strerror(errno));
- close(fd); return CRAWLER_ERR;
- }
-
- if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (const char *)&tv_out, sizeof(tv_out)) == -1)
- {
- fprintf(stderr, "setsockopt() for SO_SNDTIMEO failed: %s\n", strerror(errno));
- close(fd); return CRAWLER_ERR;
- }
- if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv_out, sizeof(tv_out)) == -1)
- {
- fprintf(stderr, "setsockopt() for SO_RCVTIMEO failed: %s\n", strerror(errno));
- close(fd); return CRAWLER_ERR;
- }
-
- return fd;
- }
- static int channel_list_extra(const char * list_buf)
- {
- char *gzip_start = NULL; char *gzip_len = NULL; int gziplen;
-
- int decode_leng = 0; char channel_list[1024*1024] = {0};
-
- gzip_start = strstr(list_buf, "\r\n\r\n") + strlen("\r\n\r\n");
-
- gzip_len = strstr(list_buf, "Content-Length: ") + strlen("Content-Length: ");
-
- gziplen = atoi(gzip_len);
-
- gzip_decode((Byte*)channel_list, (uLong *)&decode_leng, (Byte*)gzip_start, (uLong)gziplen);
-
- fprintf(stderr, "*******\n%s\n*******\n", channel_list);
-
- return CRAWLER_SUCCESS;
- }
- int main(int argc, char * argv[])
- {
- char require[1024] = {0}; int skt; int len;
-
- char list_buf_gzip[1024 * 512] = {0}; int how = 0; int total = 0;
-
- //snprintf(require, sizeof(require), "%s", "GET /zh-cn/xml/secure2.xml HTTP/1.1\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\nHost: list.pplive.com\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\n\r\n");
- //snprintf(require, sizeof(require), "%s", "GET /passport/UI/Security/images/_css.css HTTP/1.1\r\nAccept: */*\r\nReferer: [url]http://passport.pplive.com/UI/Security/minilogin.aspx[/url]\r\nAccept-Language: zh-cn\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\nHost: res.pplive.com\r\nConnection: Keep-Alive\r\n\r\n");
- snprintf(require, sizeof(require), "%s", "GET /listall2.xml HTTP/1.1\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\nHost: vodchannel.pplive.com\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\n\r\n");
-
- if ((skt = channel_list_socket()) == -1){ exit(EXIT_FAILURE); }
-
- len = strlen(require);
-
- if ((send(skt, require, len, 0)) != len)
- {
- fprintf(stderr, "send require error: %s\n", strerror(errno));
-
- exit(EXIT_FAILURE);
- }
-
- do
- {
- if ((how = recv(skt, &list_buf_gzip[total], 1024*512, 0)) == -1)
- {
- fprintf(stderr, "recv channel list error: %s\n", strerror(errno));
-
- exit(EXIT_FAILURE);
- }
-
- total += how;
-
- }while(how > 0);
-
- /* another way to know total gzip num
- char *compr = NULL; int comlen;
-
- compr = strstr(list_buf_gzip, "\r\n\r\n") + strlen("\r\n\r\n");
-
- comlen = total + list_buf_gzip - compr;
-
- fprintf(stderr, "compress len is %d\n", comlen);
- */
-
- fprintf(stderr, "*******(%d---%d)\n%s\n*******\n", strlen(list_buf_gzip), total, list_buf_gzip);
-
- close(skt);
-
- shutdown(skt, 2);
-
- channel_list_extra(list_buf_gzip);
- return EXIT_SUCCESS;
- }
复制代码
1.实际运行中发现程序阻塞在recv;如果设置超时,结果就超时退出;反正socket接受不到任何数据,但是我用抓包程序,发现服务器已经返回数据,这是为什么?
2.我用抓包程序,发现没有四次握手的连接断开,为什么?看书说close不一定会有四次握手,后来加了shutdown还是不行
3.请知道的说明一下,谢谢
[ 本帖最后由 kukule75 于 2008-6-25 21:17 编辑 ] |
|