質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Q&A

8回答

20388閲覧

C言語でHTTP通信でHTMLファイルを取得し、保存することは可能でしょうか?C言語でクローリングがしたいです。

dlrowolleh

総合スコア120

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

0グッド

2クリップ

投稿2016/07/19 08:47

編集2016/08/27 15:46

初心者です。
よろしくお願いいいたします。

早速ですが、私はC言語でWebスクレイピング・Webクローリングをしたいと思っております。

WebスクレイピングやWebクローリングについて自分自身、調べたりしたところ、PHPやpython、perl、ruby、shellscriptなどのスクリプト言語を用いるのが普通のようでした。
しかし、どうしてもC言語で実現したいと思っています。

どなたかC言語で、HTMLファイルの取得のやり方、Webスクレイピング・Webクローリングのやり方をご存知の方がいらっしゃいましたらご協力いただけませんでしょうか?

普通はスクリプト言語でやるものでC言語でやるメリットが一切分からないと言う意見も確かにあると思いますが、ここには記載することはできませんが、諸事情ありましてどうしてもC言語で実現せねばならなくなってしまいました。

私の知識はWebサイトがWebブラウザで閲覧することが可能なのは、WebブラウザがHTTPを用いて、WebサーバにHTMLファイルの送信を要求して、サーバがそのHTTPを受け取って、サーバがHTTPを用いてパソコンに通信を行ない、受け取ったHTMLファイルをWebブラウザが読み取って表示をしているということです。

ユーザーインタフェースなどは一切気にしません。
例えば、
gcc http.c
./a.out

と実行すると、
実行したパソコンの自分で指定したディレクトリにHTMLファイルが保存されるというものです。

これだけでは分からない部分もたくさんあると思います。

自分でも分からないことがたくさんあるので追記などで対応していきます。

どうかお助けください。
よろしくお願いいたします。


###追記(07/27)【vimdiff syakyou.c othon.cで打ち間違いに気がつき解決いたしました】
皆様のアドバイスをもとにプログラムを書いています。
エラーの意味が分からず困っています。
写し間違いだと思うのですが、どこを間違えているのか、エラーの描いてあることがよく分かりません。
どなたか解説していただけませか。

そもそもコードが公開されているのであれば、それをコピーすればいいのかもしれませんが、少しでも理解して身につけたいと思い、コピペはせず、見ながら打ち込むようにしています。

効率が最悪かもしれませんが、親切な方がいらっしゃいましたら、このひよっこに暖かい手を差し伸べていただけないでしょうか。

また、効率の良いやり方・勉強法等をご存知の方がいらっしゃいましたら、併せて教えていただけましたら幸いです。

よろしくお願いいたします。

参考にさせて頂いたプログラム:[C言語] HTTPクライアントを作ってみる

C

1//syakyou.c 2 1 #include <stdio.h> 3 2 #include <string.h> 4 3 #include <stdlib.h> 5 4 #include <sys/types.h> 6 5 #include <netdb.h> 7 6 #include <netinet/in.h> 8 7 #include <sys/param.h> 9 8 #include <unistd.h> 10 9 11 10 #define BUF_LEN 256 12 11 13 12 struct URL { 14 13 char host[BUF_LEN]; 15 14 char path[BUF_LEN]; 16 15 char query[BUF_LEN]; 17 16 char fragment[BUF_LEN]; 18 17 unsigned short port; 19 18 }; 20 19 21 20 /** 22 21 * @param urlStr URLテキスト 23 22 */ 24 23 void parseURL(const char *urlStr, struct URL *url, char **error); 25 24 26 25 int main(int argc, char **argv) { 27 26 28 27 //ソケットのためのファイルディスクリプタ 29 28 int s; 30 29 31 30 //IPアドレスの解決 32 31 struct addrinfo hints, *res; 33 32 struct in_addr addr; 34 33 int err; 35 34 36 35 //サーバに送るHTTPプロトコル用バッファ 37 36 char send_buf[BUF_LEN]; 38 37 39 38 struct URL url1 = { 40 39 "css-eblog.com","/",80 41 40 }; 42 41 43 42 //URLが指定されていたら 44 43 if(argc>1){ 45 44 char *error = NULL; 46 45 parseURL(argv[1],&url,&error); 47 46 48 47 if(error){ 49 48 printf("%s/n",error); 50 49 return 1; 51 50 } 52 51 } 53 52 54 53 printf("http://%s%s%sを取得します。\n\n", url.host, url1.path, url.query); 55 54 56 55 //0クリア 57 56 memset(&hints, 0, sizeof(hints)); 58 57 hints.ai_socktype = SOCK_STREAM; 59 58 hints.ai_socktyoe = AF_INET; 60 59 61 60 char *serviceType = "http"; 62 61 63 62 if((err = getaddrinfo(url.host, serviceType, &hints, &res)) != 0) { 64 63 printf("error %d\n", err); 65 64 return 1; 66 65 } 67 66 68 67 //ソケット生成 69 68 if((s = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) { 70 69 fprintf(stderr, "ソケットの作成に失敗しました。\n"); 71 70 return 1; 72 71 } 73 72 74 73 //サーバに接続 75 74 if(connect(s, res->ai_addr, res->ai_addrlen) != 0) { 76 75 fprintf(stderr, "connectに失敗しました。\n"); 77 76 return 1; 78 77 } 79 78 80 79 //HTTPプロトコルの開始 &サーバに送信 81 80 sprintf(send_buf, "GET %s%s HTTP/1.0\r\n", url.path, url.query); 82 81 write(s, send_buf, strlen(send_buf)); 83 82 84 83 sprintf(send_buf, "Host: %s:%d\r\n", url.host, url.path); 85 84 write(s, send_buf, strlen(send_buf)); 86 85 87 86 sprintf(send_buf, "\r\n"); 88 87 write(s, send_buf, strlen(send_buf)); 89 88 90 89 //受信が終わるまでループ 91 90 while(1){ 92 91 char buf[BUF_LEN]; 93 92 int read_size; 94 93 read_size = read(s, buf, BUF_LEN); 95 94 96 95 if(read_size > 0) { 97 96 write(1, buf, read_size); 98 97 } 99 98 else{ 100 99 break; 101100 } 102101 } 103102 104103 //ソケットを閉じる 105104 close(s); 106105 107106 return 0; 108107 } 109108 110109 111110 void parseURL(const char *urlStr, struct URL *url, char **error) { 112111 char host_path[BUF_LEN]; 113112 114113 if(strlen(urlStr) > BUF_LEN - 1) { 115114 *error = "URLが長すぎます。\n"; 116115 return; 117116 } 118117 119118 //http://から始まる文字列で 120119 //sscanfが成功して 121120 //http://のあとに何かの文字列が存在するなら 122121 if(strstr(urlStr, "http://") && 123122 sscanf(urlStr, "http://%s", host_path) && 124123 strcmp(urlStr, "http://")){ 125124 126125 char *p = NULL; 127126 128127 p = strchr(host_path, '#'); 129128 if(p != NULL){ 130129 strcpy(url->fragment, p); 131130 *p = '\0'; 132131 } 133132 134133 p = strchr(host_path, '?'); 135134 if(p != NULL){ 136135 strcpy(url->query, p); 137136 *p = '\0'; 138137 } 139138 140139 p = strchr(host_path, '/'); 141140 if(p != NULL){ 142141 strcpy(url->path, p); 143142 *p = '\0'; 144143 } 145144 146145 strcpy(url->host, host_path); 147146 148147 //ホスト名の部分に":"が含まれていたら 149148 p = strchr(url1->host, ':'); 150149 if(p != NULL){ 151150 //ポート番号を取得 152151 url->port = atoi(p + 1); 153152 154153 //数字ではない(atoiが失敗)か、0だったら 155154 //ポート番号は80に決め打ち 156155 if(url->port <= 0) { 157156 url->port = 80; 158157 } 159158 160159 //終端文字で空にする 161160 *p = '\0'; 162161 } 163162 else{ 164163 url->port = 80; 165164 } 166165 } 167166 else{ 168167 *error = "URLはhttp://host/pathの形式で指定してください。\n"; 169168 return; 170169 } 171170 }

###エラーコード【vimdiff syakyou.c othon.cで打ち間違いに気がつき解決いたしました】

$ gcc -o syakyou syakyou.c

syakyou.c: In function ‘main’:
syakyou.c:45:21: error: ‘url’ undeclared (first use in this function)
parseURL(argv[1],&url,&error);
^
syakyou.c:45:21: note: each undeclared identifier is reported only once for each function it appears in
syakyou.c:58:7: error: ‘struct addrinfo’ has no member named ‘ai_socktyoe’
hints.ai_socktyoe = AF_INET;
^
syakyou.c: In function ‘parseURL’:
syakyou.c:148:14: error: ‘url1’ undeclared (first use in this function)
p = strchr(url1->host, ':');
^

###試したこと【vimdiff syakyou.c othon.cで解決いたしました】
otehon.cはコピペしたテキストプログラム
syakyou.cは見ながら写したプログラム

$ diff syakyou.c otehon.c

###結果【vimdiff syakyou.c othon.cで打ち間違いに気がつき解決いたしました】
otehon.cはインデントが空白
syakyou.cはインデントがタブ
のため、差分の量が多過ぎて見分けがつかず、お手上げです。
重ね重ね申し訳ありません。


###追記(08/08)【打ち間違いに気がつき解決いたしました】
###warningが出て困っています。どなたか教えていただけないでしょうか【vimdiff syakyou.c othon.cで打ち間違いに気がつき解決いたしました】

$ gcc syakyou.c

syakyou.c: In function ‘main’:
syakyou.c:83:20: warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘char *’ [-Wformat=]
sprintf(send_buf, "Host: %s:%d\r\n", url.host, url.path); ^

です。
これはどういった意味なのでしょうか?
char型なのに %d にしているというということでしょうか?

###試したこと【vimdiff syakyou.c othon.cで打ち間違いに気がつき解決いたしました】

Chironian様のアドバイスを元に

c

1 58 hints.ai_socktyoe = AF_INET;258 hints.ai_family = AF_INET; に打ち直しました。 3url1 を 4url に直しました。

よろしくお願いします。

また、コンパイル時に
errorやwarningがあった場合、皆様はどのように解決するときのヒントや初心者が犯しやすいミスがあれば教えていただけましたら幸いです。

###追記(2016/08/23)

実行結果がうまくいっていないような気がします。

参考にさせて頂いたプログラム:[C言語] HTTPクライアントを作ってみるを実行してみたのですが、以下のような実行結果が得られました。
なんだか少し違うような気がするのですが、
実行結果がうまくいっているのかの私では判断ができません。
自信がなく、よくわからず質問してしまって申し訳ありませんが、
この実行結果で正しいのでしょうか?

$ ./a.out http://css-eblog.com/P を取得します。 // http://css-eblog.com/Pを取得しているところが少し疑問です。 // http://css-eblog.comになるのではと思いますがどうなのでしょうか…? HTTP/1.1 400 Bad Request Date: Sat, 27 Aug 2016 15:23:02 GMT Server: Apache/2.2.31 Content-Length: 226 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> // http://css-eblog.com/Pだからそんなページはないと言われてしまう? // http://css-eblog.comだったら検索できましたが // http://css-eblog.com/Pでは検索できませんでした。 </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> </body></html>

自信がなく、よくわからず質問してしまい、恐縮ですが、
http://css-eblog.com/P になってしまう原因は何でしょうか?
どうすれば http://css-eblog.com になるでしょうか?
何卒、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答8

0

libcurlを使うといいです。

C/C++のlibcurl利用サンプル

投稿2016/07/19 08:50

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dlrowolleh

2016/07/19 09:03

ありがとうございます。 こんなに早く回答をいただけるだなんて思っていませんでした。 とても心強いです。 私はC言語初心者です。 この機会に精進して参りたいと思っております。 今後もこのトピックでたくさん質問やエラーコードを投げてご迷惑をおかけするかもしれませんが、何卒よろしくお願いいたします。
dlrowolleh

2016/07/22 05:52

http://qiita.com/alaif-net@github/items/e4432c374985dc38e038 を参考にして、プログラムを書いてみました。 gcc libcurl_test.c でコンパイルしようとすると libcurl_test.c:3:23: fatal error: curl/culr.h: そのようなファイルやディレクトリはありません compilation terminated. というエラーが出ました。 ヘッダーファイルが見当たらない、というニュアンスのエラーだと思うのですが、 調べてみたのですが、解決方法がよく分かりませんでした。 どのように対処すればいいでしょうか. yuba様のアドバイスを参考に、 $ sudo apt-get install libcurl3 $ sudo apt-get install python-pycurl で libcurl3 はすでに最新版です。 python-pycurl はすでに最新版です。 になっています。 初歩的で基本的な質問で大変申し訳ありませんがよろしくお願いいたします。
guest

0

自作ライブラリから。
wStringとはstringの互換ライブラリなのでstringで読み替えれば動くと思います。
ライブラリからの切り出しなんで不都合もあるかと思いますが、
おおむねこんな感じで動くと思います。

//--------------------------------------------------------------------------- //HTTPより文字列データを取得 //引数 // char* src :URL // off_t offset :読み込みオフセット //戻り値 // wString& :読み込んだ文字列。失敗したときは長さ0 //--------------------------------------------------------------------------- wString wString::HTTPGet(const char* url, off_t offset) { int recv_len; //読み取り長さ wString buf; wString ptr; wString host; //ホスト名 wString target; //ファイル名 int work1; int work2; int work3; SOCKET server_socket; //サーバーソケット int server_port = HTTP_SERVER_PORT; //出力ファイルの設定 // ================ // 実体転送開始 // ================ //準備 //アドレスから、ホスト名とターゲットを取得 ptr.SetLength(HTTP_STR_BUF_SIZE+1); buf = url; work1 = buf.Pos("://" )+3; work2 = buf.Pos("/", work1 ); work3 = buf.Pos(":",work1); target = buf.SubString(work2,buf.len-work2); if( work3 >= 0 ){ host = buf.SubString(work1,work3-work1); server_port = atoi(buf.c_str()+work3+1); }else{ host = buf.SubString(work1,work2-work1); } //ソケット作成と接続 server_socket = sock_connect(host.String, server_port); if ( server_socket > 0 ){ //HTTP1.0 GET発行 ptr.sprintf( "GET %s HTTP/1.0\r\n" "Accept: */*\r\n" "User-Agent: %s%s\r\nHost: %s\r\nRange: bytes=%llu-\r\nConnection: close\r\n\r\n" , target.String , //"Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)", USERAGENT, MACADDR, host.String, offset); //ptr.len = strlen(ptr.String); //サーバに繋がった if( send( server_socket, ptr.String, ptr.len , 0) != SOCKET_ERROR ){ //初回分からヘッダを削除 recv_len = recv(server_socket, ptr.String, ptr.Total()-1, 0); ptr.String[recv_len] = 0; ptr.len = recv_len; //見つからない work1 = atoi(ptr.String+(ptr.Pos(" ")+1)); if( work1 < 200 || 300 <= work1 ){ sClose(server_socket); return wString(); } //content_length = atoi(buf.String+buf.Pos("Content-Length:" )+16); //\r\n\r\nを探す work1 = ptr.Pos(HTTP_DELIMITER )+4;//sizeof( HTTP_DELIMITER );//実体の先頭 recv_len -= work1; buf = ptr.SubString(work1,recv_len); //転送する while(1){ recv_len = recv(server_socket, ptr.String, ptr.Total()-1, 0); if ( recv_len <= 0 ){ break; } //エラーにならない。 ptr.len = recv_len; ptr.String[recv_len] = 0; buf += ptr; } }else{ closesocket(server_socket); return wString(); } closesocket(server_socket); }else{ return wString(); } //終了 return wString(buf); }

投稿2016/07/19 09:37

pochi0701

総合スコア210

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dlrowolleh

2016/07/19 10:32

pochi0701様 はじめまして。 大変参考になるプログラムの情報を提供していただきまして、 ありがとうございます。 当方初心者ですので、プログラムの中身を読むのに苦労しそうですが、少しずつ理解していきたいと思います。 非常に勉強になります。 本当にありがとうございます!! もし分からないところがたくさん出てきそうですが、 その時はこのトピックで質問していきたいと思います。 ご迷惑をおかけするかもしれませんが、温かい目で見守っていただけましたら幸いです。是非、今後もよろしくお願いします。 頼りになる先輩方がいらっしゃり、とても心強いです。
dlrowolleh

2016/07/22 09:11

ファイル名は HTTP.c で 写経させていただきました。 コンパイルしようと思い、 gcc HTTP.c と入力したところ、 以下のエラーメッセージが表示されました。 HTTP.c:9:1: error: unknown type name ‘string’ string string::HTTPGet(const char* url, off_t offset) ^ HTTP.c:9:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token string string::HTTPGet(const char* url, off_t offset) ^ エラーを検索してみたのですが、意味がよく分かりませんでした。 >wStringとはstringの互換ライブラリなのでstringで読み替えれば動くと思います。 とのことですが、 wStringの文字をwStringではなくstringにしてプログラムを書くということで合っていますでしょうか? wStringの文字をwStringではなくstringにしてプログラムを書いたのですが、うまく行きませんでした。 このエラーはどういった意味なのでしょうか? 考えられる原因は何が挙げられるでしょうか? また、 コンパイルできて、実行した時、どのような動きをするのでしょうか? 自身のレベルの低さゆえ 初歩的で基本的な質問をしてしまい、 大変申し訳ありません。 ご教授いただけたら幸いです。 よろしくお願いいたします。 何故か回答の評価がマイナスになっています。 皆様はどのように考えていらっしゃるのかも気になるところです。 自分にとってはとても良い勉強になっているのですが…。
yohhoy

2016/07/22 10:32

こちらの回答はC言語ではありません(C++のように見えます) また自作ライブラリ利用とのことで、回答にあるコード断片は残念ながら質問者の役には立たないでしょう。
pochi0701

2016/07/25 06:44

c言語でしたか。 よく読まなくてスミマセン cに変換して別に投稿させて頂きます。
guest

0

C言語でというのは標準ライブラリだけででしょうか、OSSライブラリを使うのはありなのでしょうか。
libcurlを使っていいのなら、こちらなど。
https://www.ibm.com/developerworks/jp/opensource/library/os-curl/

投稿2016/07/19 08:52

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dlrowolleh

2016/07/19 09:19

ありがとうございます。 こんなに早く回答をいただけるだなんて思っていませんでした。 とても心強いです。 私はC言語初心者です。 この機会に精進して参りたいと思っております。 OSSのライブラリを使用することに関しましては、問題ないです。 当方初心者でして、ライブラリの使い方等には慣れてない部分もあるため、このトピックで質問やエラーで質問しご迷惑をおかけすると思いますが何卒よろしくお願いします。
dlrowolleh

2016/07/22 06:49

https://www.ibm.com/developerworks/jp/opensource/library/os-curl/ を参考にプログラムを書いて ファイル名は httpcliant.c で gcc httpcliant.c と コンパイルしようとしたのですが、 httpcliant.c:3:23: fatal error: curl/curl.h: そのようなファイルやディレクトリはありません と エラーがでました。 ヘッダファイルが見当たらない、 というニュアンスのエラーだと思うのですが、 このエラーはどういう意味でしょうか? ヘッダーファイルが見当たらないなどで調べてみたのですが、 解決方法がよく分かりませんでした。 また、 このエラーとは関係ないかもしれませんが、 $ sudo apt-get install libcurl3 $ sudo apt-get install python-pycurl で libcurl3 はすでに最新版です。 python-pycurl はすでに最新版です。 と表示されます。 初歩的で基本的な質問で大変もし訳ありませんが、 自身のレベルの低さゆえ、 ご迷惑をおかけしてしまい申し訳ありません。 ご教授いただけましたら幸いせす。 よろしくお願いします。
guest

0

こんにちは。

回答依頼を頂きましたので、追記分について回答します。

syakyou.c: In function ‘main’:

syakyou.c:45:21: error: ‘url’ undeclared (first use in this function)
parseURL(argv[1],&url,&error);
^

url1という変数を定義してますが、urlという変数は定義していません。
名前を合わせましょう。

syakyou.c:45:21: note: each undeclared identifier is reported only once for each function it appears in

syakyou.c:58:7: error: ‘struct addrinfo’ has no member named ‘ai_socktyoe’
hints.ai_socktyoe = AF_INET;
^

タイプ・ミスと思います。
hints.ai_family = AF_INET;ではないでしょうか?

syakyou.c: In function ‘parseURL’:
syakyou.c:148:14: error: ‘url1’ undeclared (first use in this function)
p = strchr(url1->host, ':');

url1はmain()関数で定義されてます。parseURL()関数の仮引数名はurlですのでurlとすれば良いように思います。

投稿2016/07/27 06:16

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dlrowolleh

2016/09/06 04:09

ありがとうございます! 無事にコンパイルできました! 返信遅れてしまいすみませんでした。
guest

0

上のものです。
せっかく書いたので、C言語に変換してかるく直してみました。
strcpy系の関数を使ってるので画像などは取れません。
linuxで動かすときは#define linuxと入れてください。includeも適宜直してください。動くんじゃないかなと思います。
(重ね重ねスミマセン)

#include <stdio.h> #include <winsock2.h> //--------------------------------------------------------------------------- #define HTTP_SERVER_PORT 80 #define HTTP_DELIMITER ("\r\n\r\n") #define USERAGENT "test-client" #ifdef linux #define SERROR(x) ((x) < 0 ) #else #define SERROR(x) ((x) == INVALID_SOCKET) #endif int sClose(SOCKET socket) { int ret; #ifdef linux ret = shutdown( socket , SD_BOTH ); ret = close(socket); #else ret = shutdown( socket , SD_BOTH ); ret = closesocket(socket); #endif return ret; } //--------------------------------------------------------------------------- SOCKET sock_connect(const char *host, const int port) { // int sock; SOCKET sock; struct sockaddr_in sockadd={0}; //SOCKET構造体 struct hostent *hent; //SOCKET作成 if (SERROR(sock = socket(PF_INET, SOCK_STREAM, 0))){ return INVALID_SOCKET; } if (NULL == (hent = gethostbyname(host))) { sClose( sock ); return INVALID_SOCKET; } //ソケット構造体へアドレス設定 memcpy(&sockadd.sin_addr, hent->h_addr, hent->h_length); //ソケット構造体へポート設定 sockadd.sin_port = htons((u_short)port); //IPV4アドレスファミリを設定 sockadd.sin_family = AF_INET; //接続 if (SERROR(connect(sock, (struct sockaddr*)&sockadd, sizeof(sockadd)))) { sClose( sock ); return INVALID_SOCKET; } return sock; } //--------------------------------------------------------------------------- //HTTPより文字列データを取得 //引数 // char* src :URL // off_t offset :読み込みオフセット //戻り値 // wString& :読み込んだ文字列。失敗したときは長さ0 //--------------------------------------------------------------------------- #define HTTP_STR_BUF_SIZE (1024*100) #define BUFFER_SIZE (1024) char* HTTPGet(char* url, int offset) { int recv_len; //読み取り長さ static char buf[HTTP_STR_BUF_SIZE+1]; char* ptr[BUFFER_SIZE+1]; char host[80]; //ホスト名 char target[80]; //ファイル名 char* work1; char* work2; char* work3; int work4; int bufptr=0; SOCKET server_socket; //サーバーソケット int server_port = HTTP_SERVER_PORT; //出力ファイルの設定 // ================ // 実体転送開始 // ================ //buf = (char*)malloc(HTTP_BUF_SIZE); //ptr = buf; //準備 //アドレスから、ホスト名とターゲットを取得 strcpy((char*)ptr,url); work1 = strstr( (char*)ptr,"://")+3; work2 = strstr( work1, "/"); work3 = strstr( work2,":"); strcpy( target, work2 ); strcpy( host , work1 ); if( work3 ){ host[work3-work1] = 0; server_port = atoi(work3+1); }else{ host[work2-work1] = 0; } //ソケット作成と接続 server_socket = sock_connect(host, server_port); if ( ! SERROR(server_socket) ){ //HTTP1.0 GET発行 sprintf( (char*)ptr, "GET %s HTTP/1.0\r\n" "Accept: */*\r\n" "User-Agent: %s\r\nHost: %s\r\nRange: bytes=%llu-\r\nConnection: close\r\n\r\n" , target, USERAGENT, host, offset); //サーバに繋がった if( send( server_socket, (char*)ptr, strlen((char*)ptr) , 0) != SOCKET_ERROR ){ //初回分からヘッダを削除 recv_len = recv(server_socket, (char*)ptr, BUFFER_SIZE, 0); if( SERROR(recv_len) ){ return NULL; } ptr[recv_len] = 0; //サーバ上で見つからないときはNULL work4 = atoi(strstr((char*)ptr," ")+1); if( work4 < 200 || 300 <= work4 ){ sClose(server_socket); return NULL; } //\r\n\r\nを探す work1 = strstr( (char*)ptr, HTTP_DELIMITER )+4; recv_len -= (work1-(char*)ptr); strncpy( buf+bufptr, work1, recv_len); bufptr+=recv_len; buf[bufptr] = 0; //転送する while(1){ recv_len = recv(server_socket, (char*)ptr, BUFFER_SIZE, 0); if ( recv_len <= 0 ){ break; } //エラーにならない。 ptr[recv_len] = 0; strncpy( buf+bufptr, (char*)ptr, recv_len); bufptr+=recv_len; buf[bufptr] = 0; } sClose(server_socket); return buf; }else{ sClose(server_socket); return NULL; } } return NULL; } //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { char* buffer; WSADATA wsa; WORD version = MAKEWORD(2, 0); WSAStartup(version, &wsa); buffer = HTTPGet("http://news.yahoo.co.jp/pickup/6208830",0); if( buffer && *buffer ){ FILE* ws = fopen( "temp.txt", "wb" ); fwrite( buffer, strlen(buffer), 1,ws ); fclose( ws ); }else{ puts( "can't get data"); } WSACleanup(); return 0; } //---------------------------------------------------------------------------

投稿2016/07/25 06:53

pochi0701

総合スコア210

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dlrowolleh

2016/08/21 10:30

pochi0701様 返信遅れてしまい、すみません。 回答いただいたコードを写してコンパイルしようとしてみたのですが、 $ gcc http.c tehon.c:2:22: fatal error: winsock2.h: そのようなファイルやディレクトリはありません compilation terminated. と表示されました。 linuxで動かすときは#define linuxと入れてください。includeも適宜直してください。動くんじゃないかなと思います。 とのことですが、 現在は、上記のコードをそのまま写したままの状態です。写し間違いもあるとは思いますが、詳しく教えていただけませんでしょうか? 環境はUbuntu16.04です。 お手数ですが何卒よろしくお願いいたします。
dlrowolleh

2016/08/21 10:37

追記します。 とりあえず、winsock2.hの行を コメントアウトして、 #define linux を追加しました。 1 #include <stdio.h> 2 //#include <winsock2.h> 3 #define linux 4 5 //-------------------------------------------------------------------------- 6 #define HTTP_SERVER_PORT 80 7 #define HTTP_DELIMITER ("\r\n\r\n") 8 #define USERAGENT "test-client" ~~以下省略~~ その後、コンパイルしようとしたところ、以下のようなメッセージが表示されました。 $ gcc http.c Desktop/hoge/http.c:3:0: warning: "linux" redefined #define linux ^ <built-in>: note: this is the location of the previous definition Desktop/hoge/http.c:15:12: error: unknown type name ‘SOCKET’ int sClose(SOCKET socket) ^ Desktop/hoge/http.c:29:1: error: unknown type name ‘SOCKET’ SOCKET sock_connect(const char *host, const int port) ^ Desktop/hoge/http.c: In function ‘sock_connect’: Desktop/hoge/http.c:32:5: error: unknown type name ‘SOCKET’ SOCKET sock; ^ Desktop/hoge/http.c:33:12: error: variable ‘sockadd’ has initializer but incomplete type struct sockaddr_in sockadd={0}; //SOCKET構造体 ^ Desktop/hoge/http.c:33:33: warning: excess elements in struct initializer struct sockaddr_in sockadd={0}; //SOCKET構造体 ^ Desktop/hoge/http.c:33:33: note: (near initialization for ‘sockadd’) Desktop/hoge/http.c:33:24: error: storage size of ‘sockadd’ isn’t known struct sockaddr_in sockadd={0}; //SOCKET構造体 ^ Desktop/hoge/http.c:36:23: warning: implicit declaration of function ‘socket’ [-Wimplicit-function-declaration] if (SERROR(sock = socket(PF_INET, SOCK_STREAM, 0))){ ^ Desktop/hoge/http.c:11:21: note: in definition of macro ‘SERROR’ #define SERROR(x) ((x) < 0 ) ^ Desktop/hoge/http.c:36:30: error: ‘PF_INET’ undeclared (first use in this function) if (SERROR(sock = socket(PF_INET, SOCK_STREAM, 0))){ ^ Desktop/hoge/http.c:11:21: note: in definition of macro ‘SERROR’ #define SERROR(x) ((x) < 0 ) ^ Desktop/hoge/http.c:36:30: note: each undeclared identifier is reported only once for each function it appears in if (SERROR(sock = socket(PF_INET, SOCK_STREAM, 0))){ ^ Desktop/hoge/http.c:11:21: note: in definition of macro ‘SERROR’ #define SERROR(x) ((x) < 0 ) ^ Desktop/hoge/http.c:36:39: error: ‘SOCK_STREAM’ undeclared (first use in this function) if (SERROR(sock = socket(PF_INET, SOCK_STREAM, 0))){ ^ Desktop/hoge/http.c:11:21: note: in definition of macro ‘SERROR’ #define SERROR(x) ((x) < 0 ) ^ Desktop/hoge/http.c:37:14: error: ‘INVALID_SOCKET’ undeclared (first use in this function) return INVALID_SOCKET; ^ Desktop/hoge/http.c:39:24: warning: implicit declaration of function ‘gethostbyname’ [-Wimplicit-function-declaration] if(NULL == (hent = gethostbyname(host))){ ^ Desktop/hoge/http.c:39:22: warning: assignment makes pointer from integer without a cast [-Wint-conversion] if(NULL == (hent = gethostbyname(host))){ ^ Desktop/hoge/http.c:40:7: warning: implicit declaration of function ‘sClose’ [-Wimplicit-function-declaration] sClose(sock); ^ Desktop/hoge/http.c:41:14: error: ‘INvALID_SOCKET’ undeclared (first use in this function) return INvALID_SOCKET; ^ Desktop/hoge/http.c:44:5: warning: implicit declaration of function ‘memcpy’ [-Wimplicit-function-declaration] memcpy(&sockadd.sin_addr, hent->h_addr, hent->h_length); ^ Desktop/hoge/http.c:44:5: warning: incompatible implicit declaration of built-in function ‘memcpy’ Desktop/hoge/http.c:44:5: note: include ‘<string.h>’ or provide a declaration of ‘memcpy’ Desktop/hoge/http.c:44:35: error: dereferencing pointer to incomplete type ‘struct hostent’ memcpy(&sockadd.sin_addr, hent->h_addr, hent->h_length); ^ Desktop/hoge/http.c:46:24: warning: implicit declaration of function ‘htons’ [-Wimplicit-function-declaration] sockadd.sin_port = htons((u_short)port); ^ Desktop/hoge/http.c:46:31: error: ‘u_short’ undeclared (first use in this function) sockadd.sin_port = htons((u_short)port); ^ ~~続きます~~
dlrowolleh

2016/08/21 10:38

~~続きです~~ Desktop/hoge/http.c:46:39: error: expected ‘)’ before ‘port’ sockadd.sin_port = htons((u_short)port); ^ Desktop/hoge/http.c:48:26: error: ‘AF_INET’ undeclared (first use in this function) sockadd.sin_family = AF_INET; ^ Desktop/hoge/http.c:50:16: warning: implicit declaration of function ‘connect’ [-Wimplicit-function-declaration] if (SERROR(connect(sock, (struct sockaddr*)&sockadd. sizeof(sockadd)))){ ^ Desktop/hoge/http.c:11:21: note: in definition of macro ‘SERROR’ #define SERROR(x) ((x) < 0 ) ^ Desktop/hoge/http.c:50:58: error: expected identifier before ‘sizeof’ if (SERROR(connect(sock, (struct sockaddr*)&sockadd. sizeof(sockadd)))){ ^ Desktop/hoge/http.c:11:21: note: in definition of macro ‘SERROR’ #define SERROR(x) ((x) < 0 ) ^ Desktop/hoge/http.c: In function ‘HTTPGet’: Desktop/hoge/http.c:79:5: error: unknown type name ‘SOCKET’ SOCKET sever_socket; //サーバソケット ^ Desktop/hoge/http.c:89:5: warning: implicit declaration of function ‘strcpy’ [-Wimplicit-function-declaration] strcpy((char*)ptr,url); ^ Desktop/hoge/http.c:89:5: warning: incompatible implicit declaration of built-in function ‘strcpy’ Desktop/hoge/http.c:89:5: note: include ‘<string.h>’ or provide a declaration of ‘strcpy’ Desktop/hoge/http.c:90:13: warning: implicit declaration of function ‘strstr’ [-Wimplicit-function-declaration] work1 = strstr((char*)ptr,"://")+3; ^ Desktop/hoge/http.c:90:13: warning: incompatible implicit declaration of built-in function ‘strstr’ Desktop/hoge/http.c:90:13: note: include ‘<string.h>’ or provide a declaration of ‘strstr’ Desktop/hoge/http.c:91:20: error: ‘work’ undeclared (first use in this function) work2 = strstr(work, "/"); ^ Desktop/hoge/http.c:92:26: error: expected identifier before string constant work3 = strstr(work. ":"); ^ Desktop/hoge/http.c:92:13: error: too few arguments to function ‘strstr’ work3 = strstr(work. ":"); ^ Desktop/hoge/http.c:97:7: error: ‘server_port’ undeclared (first use in this function) server_port = atoi(work3+1); ^ Desktop/hoge/http.c:97:21: warning: implicit declaration of function ‘atoi’ [-Wimplicit-function-declaration] server_port = atoi(work3+1); ^ Desktop/hoge/http.c:102:5: error: ‘server_socket’ undeclared (first use in this function) server_socket = sock_connect(host, server_port); ^ Desktop/hoge/http.c:107:21: warning: unknown escape sequence: '\m' "User-Agent: %s\r\nHost: %s\r\nRange: bytes=%llu-\r\nConnec ^ Desktop/hoge/http.c:105:29: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 6 has type ‘int’ [-Wformat=] sprintf((char*)ptr, "GET %s HTTP/1.0\r\n" ^ Desktop/hoge/http.c:113:10: warning: implicit declaration of function ‘send’ [-Wimplicit-function-declaration] if(send(server_socket, (char*)ptr, strlen((char*)ptr), 0) != SOCKET_ERROR ^ Desktop/hoge/http.c:113:42: warning: implicit declaration of function ‘strlen’ [-Wimplicit-function-declaration] if(send(server_socket, (char*)ptr, strlen((char*)ptr), 0) != SOCKET_ERROR ^ Desktop/hoge/http.c:113:42: warning: incompatible implicit declaration of built-in function ‘strlen’ Desktop/hoge/http.c:113:42: note: include ‘<string.h>’ or provide a declaration of ‘strlen’ Desktop/hoge/http.c:113:68: error: ‘SOCKET_ERROR’ undeclared (first use in this function) if(send(server_socket, (char*)ptr, strlen((char*)ptr), 0) != SOCKET_ERROR ^ Desktop/hoge/http.c:115:20: warning: implicit declaration of function ‘recv’ [-Wimplicit-function-declaration] recv_len = recv(server_socket, (char*)ptr, BUFFER_SIZE, 0); ^ Desktop/hoge/http.c:129:7: warning: implicit declaration of function ‘strncpy’ [-Wimplicit-function-declaration] strncpy(buf+bufptr, work1, recv_len); ^ Desktop/hoge/http.c:129:7: warning: incompatible implicit declaration of built-in function ‘strncpy’ Desktop/hoge/http.c:129:7: note: include ‘<string.h>’ or provide a declaration of ‘strncpy’ Desktop/hoge/http.c:130:15: error: ‘recb_len’ undeclared (first use in this function) bufptr+=recb_len; ^ Desktop/hoge/http.c:66:27: error: expected identifier before ‘(’ token #define BUFFER_SIZE (1024) ^ Desktop/hoge/http.c:134:52: note: in expansion of macro ‘BUFFER_SIZE’ recv_len = recv(server_socket, (char*)ptr. BUFFER_SIZE, 0); ^ Desktop/hoge/http.c:140:29: error: expected identifier before ‘(’ token strncpy(buf+bufptr. (char*)ptr, recv_len); ^ Desktop/hoge/http.c:140:9: error: too few arguments to function ‘strncpy’ strncpy(buf+bufptr. (char*)ptr, recv_len); ^ Desktop/hoge/http.c: In function ‘main’: Desktop/hoge/http.c:157:5: error: unknown type name ‘WSADATA’ WSADATA wsa; ^ Desktop/hoge/http.c:158:5: error: unknown type name ‘WORD’ WORD version = MAKEWORD(2, 0); ^ Desktop/hoge/http.c:158:20: warning: implicit declaration of function ‘MAKEWORD’ [-Wimplicit-function-declaration] WORD version = MAKEWORD(2, 0); ^ Desktop/hoge/http.c:159:5: warning: implicit declaration of function ‘WSAStartup’ [-Wimplicit-function-declaration] WSAStartup(version,&wsa); ^ Desktop/hoge/http.c:162:18: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘~’ token FILE* ws ~ fopen("temp.txt", "wb"); ^ Desktop/hoge/http.c:162:18: error: wrong type argument to bit-complement Desktop/hoge/http.c:163:23: warning: incompatible implicit declaration of built-in function ‘strlen’ fwrite(buffer,strlen(buffer), 1, ws); ^ Desktop/hoge/http.c:163:23: note: include ‘<string.h>’ or provide a declaration of ‘strlen’ Desktop/hoge/http.c:163:42: error: ‘ws’ undeclared (first use in this function) fwrite(buffer,strlen(buffer), 1, ws); ^ Desktop/hoge/http.c:168:5: warning: implicit declaration of function ‘WSACleanup’ [-Wimplicit-function-declaration] WSACleanup(); ^ このエラーはどういった意味でしょうか? 重ね重ね申し訳ありませんが何卒よろしくお願いいたします。 長文大変失礼いたしました。
pochi0701

2016/08/22 02:06

おや。Linuxで動作でしたか。 WSACleanupとかはwindows版のおまじないなので。 また、Linuxに書き直すので少しお待ちください。
pochi0701

2016/08/22 23:51

linuxではWSACleanup抜いてinclude増やせばおおむね動きます。 リソースを消費してすみませんが、回答を増やして、linuxで うごく版を記載しておきます。
guest

0

流れを見ないで書いてみるけど

libcurl3-dev みたいな名前のパッケージが別途あって、
インクルードファイルやライブラリがそっちに入っている
なんとことはない?

ソース丸ごと落としてきてconfigureからやったほうが早かったりしない?

投稿2016/07/22 14:38

kopio

総合スコア487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kopio

2016/07/27 06:07

syakyou.c:45:21: error: ‘url’ undeclared (first use in this function) parseURL(argv[1],&url,&error); ^ url という変数は定義されていません。 url1でしょうか? syakyou.c:58:7: error: ‘struct addrinfo’ has no member named ‘ai_socktyoe’ hints.ai_socktyoe = AF_INET; ^ ai_socktyoe はai_socktypeのタイプミスでしょうか エラーメッセージには書かれていませんが、AF_INETはai_familyに設定する定数だと思います。 syakyou.c: In function ‘parseURL’: syakyou.c:148:14: error: ‘url1’ undeclared (first use in this function) p = strchr(url1->host, ':'); ^ parseURL関数では url1 という変数は定義されていません。 パラメータで宣言しているのは url になっています。
dlrowolleh

2016/09/06 04:03

ご回答いただきありがとうございます。 返信遅くなり大変失礼しました。 最近ようやくC言語の基礎の本を読み終え、ファイルのインクルードやパス名のことがなんとなく分かった気がします。 また、きちんとコンパイルできました。 C言語は少し難しいので、しっかり勉強したいと思っています。
kopio

2016/10/25 01:25

もうとっくに解決しているかもしれませんが・・・ ```C struct URL { char host[BUF_LEN]; char path[BUF_LEN]; char query[BUF_LEN]; char fragment[BUF_LEN]; unsigned short port; }; // 中略 struct URL url = { "css-eblog.com", "/", 80 }; printf("http://%s%s%s を取得します。\n\n", url.host, url.path, url.query); ``` 3番目のメンバを80で初期化しているから、文字コードして扱われてqueryの先頭に文字'P'が入っています。 初期化時にqueryとfragmentも""を設定するか、構造体定義時にメンバの順番を変えてみてはどうでしょうか。 こんなとか ```C struct URL url = { "css-eblog.com", "/", "", "", 80 }; ``` もしくは、こうとか(両方やっちゃだめですよ) ```C struct URL { char host[BUF_LEN]; char path[BUF_LEN]; unsigned short port; char query[BUF_LEN]; char fragment[BUF_LEN]; }; ```
guest

0

curlに関して
「ヘッダーファイルが見当たらない」ということですが、もし適切にcurlライブラリがダウンロードされているのであれば、ヘッダファイルやライブラリファイルへのパスが通っていないと言うことだと思います。

http://qiita.com/edo_m18/items/a0073d81431bfd5681e2
上記のサイトを参考にし

-L/usr/local/opt/curl/lib -I/usr/local/opt/curl/include

「-I」コマンドでヘッダフォルダへのパスを
「-L」コマンドでlibcurlが入っているライブラリフォルダへのパスを
「-l」コマンドでライブラリファイル「curl」を指定してみてください。

また、余計なお世話かもしれませんが、一人一人にコメント一つ分のあいさつはしなくても大丈夫だと思いますよ。

投稿2016/07/22 11:15

HURONT

総合スコア42

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dlrowolleh

2016/09/06 04:07

ご回答いただきありがとうございます。 C言語の本を読み、ライブラリフォルダのパスなどのことがなんとなくわかりました。 URL参考になりました。 ありがとうございます。 >また、余計なお世話かもしれませんが、一人一人にコメント一つ分のあいさつはしなくても大丈夫だと思いますよ。 少し諄かったかもしれませんね…。気を付けます…。
guest

0

linux版です

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <netinet/in.h> #include <netdb.h> //--------------------------------------------------------------------------- #define HTTP_SERVER_PORT 80 #define HTTP_DELIMITER ("\r\n\r\n") #define USERAGENT "test-client" #define SOCKET int #define SD_WRITE SHUT_WR #define SD_READ SHUT_RD #define SD_BOTH SHUT_RDWR #define INVALID_SOCKET (-1) #define SOCKET_ERROR (-1) #ifdef linux #define SERROR(x) ((x) < 0 ) #else #define SERROR(x) ((x) == INVALID_SOCKET) #endif int sClose(SOCKET socket) { int ret; #ifdef linux ret = shutdown( socket , SD_BOTH ); ret = close(socket); #else ret = shutdown( socket , SD_BOTH ); ret = closesocket(socket); #endif return ret; } //--------------------------------------------------------------------------- SOCKET sock_connect(const char *host, const int port) { // int sock; SOCKET sock; struct sockaddr_in sockadd={0}; //SOCKET構造体 struct hostent *hent; //SOCKET作成 if (SERROR(sock = socket(PF_INET, SOCK_STREAM, 0))){ return INVALID_SOCKET; } if (NULL == (hent = gethostbyname(host)) ) { sClose( sock ); return INVALID_SOCKET; } //ソケット構造体へポート設定 sockadd.sin_port = htons((u_short)port); //IPV4アドレスファミリを設定 sockadd.sin_family = AF_INET; //ソケット構造体へアドレス設定 memcpy(&sockadd.sin_addr, hent->h_addr, hent->h_length); //接続 if (SERROR(connect(sock, (struct sockaddr*)&sockadd, sizeof(sockadd)))) { sClose( sock ); return INVALID_SOCKET; } return sock; } //--------------------------------------------------------------------------- //HTTPより文字列データを取得 //引数 // char* src :URL // off_t offset :読み込みオフセット //戻り値 // wString& :読み込んだ文字列。失敗したときは長さ0 //--------------------------------------------------------------------------- #define HTTP_STR_BUF_SIZE (1024*100) #define BUFFER_SIZE (1024) char* HTTPGet(char* url, size_t offset) { int recv_len; //読み取り長さ static char buf[HTTP_STR_BUF_SIZE+1]; char* ptr[BUFFER_SIZE+1]; char host[80]; //ホスト名 char target[80]; //ファイル名 char* work1; char* work2; char* work3; int work4; int bufptr=0; SOCKET server_socket; //サーバーソケット int server_port = HTTP_SERVER_PORT; //出力ファイルの設定 // ================ // 実体転送開始 // ================ //buf = (char*)malloc(HTTP_BUF_SIZE); //ptr = buf; //準備 //アドレスから、ホスト名とターゲットを取得 strcpy((char*)ptr,url); work1 = strstr( (char*)ptr,"://")+3; work2 = strstr( work1, "/"); work3 = strstr( work2,":"); strcpy( target, work2 ); strcpy( host , work1 ); if( work3 ){ host[work3-work1] = 0; server_port = atoi(work3+1); }else{ host[work2-work1] = 0; } //ソケット作成と接続 server_socket = sock_connect(host, server_port); if ( ! SERROR(server_socket) ){ //HTTP1.0 GET発行 sprintf( (char*)ptr, "GET %s HTTP/1.0\r\n" "Accept: */*\r\n" "User-Agent: %s\r\nHost: %s\r\nRange: bytes=%lu-\r\nConnection: close\r\n\r\n" , target, USERAGENT, host, offset); //サーバに繋がった if( send( server_socket, (char*)ptr, strlen((char*)ptr) , 0) != SOCKET_ERROR ){ //初回分からヘッダを削除 recv_len = recv(server_socket, (char*)ptr, BUFFER_SIZE, 0); if( SERROR(recv_len) ){ return NULL; } ptr[recv_len] = 0; //サーバ上で見つからないときはNULL work4 = atoi(strstr((char*)ptr," ")+1); if( work4 < 200 || 300 <= work4 ){ sClose(server_socket); return NULL; } //\r\n\r\nを探す work1 = strstr( (char*)ptr, HTTP_DELIMITER )+4; recv_len -= (work1-(char*)ptr); strncpy( buf+bufptr, work1, recv_len); bufptr+=recv_len; buf[bufptr] = 0; //転送する while(1){ recv_len = recv(server_socket, (char*)ptr, BUFFER_SIZE, 0); if ( recv_len <= 0 ){ break; } //エラーにならない。 ptr[recv_len] = 0; strncpy( buf+bufptr, (char*)ptr, recv_len); bufptr+=recv_len; buf[bufptr] = 0; } sClose(server_socket); return buf; }else{ printf( "Can not connect to %s\n",url); sClose(server_socket); return NULL; } } return NULL; } //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { char* buffer; buffer = HTTPGet((char*)"http://www.birdland.co.jp/",0); if( buffer && *buffer ){ FILE* ws = fopen( "temp.txt", "wb" ); fwrite( buffer, strlen(buffer), 1,ws ); fclose( ws ); }else{ puts( "can't get data"); } return 0; } //---------------------------------------------------------------------------

投稿2016/08/22 23:51

pochi0701

総合スコア210

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dlrowolleh

2016/09/06 04:10

ありがとうございます! 返信遅くなり申し訳ありません。 何度も何度もすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問