file - c program not writing same result as it is displaying -
my c program not writing file same data displaying. how save outputted screen in file. trying save webpage, file name defined third option, [site] [page] [path]
#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <netdb.h> #include <string.h> int create_tcp_socket(); char *get_ip(char *host); char *build_get_query(char *host, char *page); void usage(); #define host "coding.debuntu.org" #define page "/" #define port 80 #define useragent "htmlget 1.0" #define os "mac osx" int main(int argc, char **argv) { struct sockaddr_in *remote; int sock; int tmpres; char *ip; char *get; char buf[bufsiz+1]; char *host; char *page; char *htmlfile; if(argc == 1){ usage(); exit(2); } host = argv[1]; if(argc > 2){ page = argv[2]; }else{ page = page; } htmlfile = argv[3]; sock = create_tcp_socket(); ip = get_ip(host); fprintf(stderr, "<!--\nip %s\n", ip); remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *)); remote->sin_family = af_inet; tmpres = inet_pton(af_inet, ip, (void *)(&(remote->sin_addr.s_addr))); if( tmpres < 0) { perror("can't set remote->sin_addr.s_addr"); exit(1); }else if(tmpres == 0) { fprintf(stderr, "%s not valid ip address\n", ip); exit(1); } remote->sin_port = htons(port); if(connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) < 0){ perror("could not connect"); exit(1); } = build_get_query(host, page); fprintf(stderr, "nquery is:\n<<start>>\n%s<<end>>\n-->\n", get); //send query server int sent = 0; while(sent < strlen(get)) { tmpres = send(sock, get+sent, strlen(get)-sent, 0); if(tmpres == -1){ perror("can't send query"); exit(1); } sent += tmpres; } //now time receive page memset(buf, 0, sizeof(buf)); int htmlstart = 0; char * htmlcontent; while((tmpres = recv(sock, buf, bufsiz, 0)) > 0){ if(htmlstart == 0) { /* under conditions not work. * if \r\n\r\n part splitted 2 messages * fail detect beginning of html content */ htmlcontent = strstr(buf, "\r\n\r\n"); if(htmlcontent != null){ htmlstart = 1; htmlcontent += 4; } }else{ htmlcontent = buf; } if(htmlstart){ fprintf(stdout, "%s", htmlcontent); } file *f; f = fopen(htmlfile, "w"); fprintf(f, "%s", htmlcontent); //stderr, "%s" fclose(f); memset(buf, 0, tmpres); } if(tmpres < 0) { perror("error receiving data"); } free(get); free(remote); free(ip); close(sock); return 0; } void usage() { fprintf(stderr, "usage: htmlget host [page]\n\ \thost: website hostname. ex: coding.debuntu.org\n\ \tpage: page retrieve. ex: index.html, default: /\n"); } int create_tcp_socket() { int sock; if((sock = socket(af_inet, sock_stream, ipproto_tcp)) < 0){ perror("can't create tcp socket"); exit(1); } return sock; } char *get_ip(char *host) { struct hostent *hent; int iplen = 15; //xxx.xxx.xxx.xxx char *ip = (char *)malloc(iplen+1); memset(ip, 0, iplen+1); if((hent = gethostbyname(host)) == null) { herror("can't ip"); exit(1); } if(inet_ntop(af_inet, (void *)hent->h_addr_list[0], ip, iplen) == null) { perror("can't resolve host"); exit(1); } return ip; } char *build_get_query(char *host, char *page) { char *query; char *getpage = page; char *tpl = "get /%s http/1.0\r\nhost: %s\r\nuser-agent: %s\r\n\r\n"; if(getpage[0] == '/'){ getpage = getpage + 1; fprintf(stderr,"removing leading \"/\", converting %s %s\n", page, getpage); } // -5 consider %s %s %s in tpl , ending \0 query = (char *)malloc(strlen(host)+strlen(getpage)+strlen(useragent)+strlen(os)+strlen(tpl)-5); sprintf(query, tpl, getpage, host, useragent); return query; // file *f; // f = fopen(htmlfile, "w"); // fprintf(f, htmlcontent); // fclose(f); }
here saving file:
file *f; f = fopen(htmlfile, "w"); fprintf(f, "%s", htmlcontent); //stderr, "%s" fclose(f);
here result saves question (this page)
(['_setcustomvar', 1, 'tags', '|c|file|networking|']); _gaq.push(['_trackpageview']); var _qevents = _qevents || []; (function () { var ssl='https:'==document.location.protocol, s=document.getelementsbytagname('script')[0], ga=document.createelement('script'); ga.type='text/javascript'; ga.async=true; ga.src=(ssl?'https://ssl':'http://www')+'.google-analytics.com/ga.js'; s.parentnode.insertbefore(ga,s); var sc=document.createelement('script'); sc.type='text/javascript'; sc.async=true; sc.src=(ssl?'https://secure':'http://edge')+'.quantserve.com/quant.js'; s.parentnode.insertbefore(sc,s); })(); _qevents.push({ qacct: "p-c1rf4kxgluznc" }); </script> </body> </html>
file *f; f = fopen(htmlfile, "w"); fprintf(f, "%s", htmlcontent); //stderr, "%s" fclose(f);
rather opening , closing file each time through loop, should open once before loop, keep open while you're writing it, close after loop.
Comments
Post a Comment