2011-01-01から1年間の記事一覧
名前 split_text, freesplitedtext, search_delimiter - 文字列を区切り文字で分割する 書式 int split_text (const char *string, const char *delimiter, struct splitedtext **res); int freesplitedtext (struct splitedtext *res); int search_delimite…
URLパーサをつくるときに文字列分割用にstrtok_r()関数を利用したのだけど、なんかしっくりとこなかった(ただの勉強不足なわけですが...)ので勉強の為にも文字列分割ライブラリをつくってみた。 今回勉強になったもの ユーザー関数 構造体による連結リスト…
URLパーサを自作ライブラリの split_text() をつかって書き換える useragentのURL対応 useragentのファイル保存対応 Makeファイルの導入
今まで勉強したことのまとめとして、指定ホストのトップページをGETで読み込み、HTTPレスポンスを標準出力に表示するツールをつくってみました。 /** * useragent.c **/ #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <unistd.h> #define BUF</unistd.h></arpa/inet.h></string.h></stdio.h></netdb.h></sys/socket.h></sys/types.h>…
ブログを書き始めて感じたこと。 伝えたい内容を簡潔にまとめる能力をもっとつけないといけない。特にソースコード中のコメントとか、バージョン管理システムにコミットするときのメッセージをもっとわかりやすく書けるようになりたい。昔はもっとちゃんとし…
HTTP Clientですが、libcurlが参考になりそう。MITラインセスってのがいいですね。
GPLのコードを1行でも取り込んだ場合は、ソフトウェア全体をGPLで配布しなければいけませんが、BSDやMITライセンスのコードを一部取り込んだ場合のライセンス表記ってどうなってるんだろう?と思っていろいろ調べてみた。BSDライセンスに関しては、Wikipedi…
URLを「スキーム、ホスト、ポート、パス、クエリー」に分解するツールをつくってみました。 ソース /** * url_parser.c **/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define URL_MAX_LEN 2083 /* IEの制限と同じ数値に設定 */ #define SCHEME_MAX_LEN 32 #define SCH</string.h></stdlib.h></stdio.h>…
名前解決には、gethostbyname()ではなく、getaddrinfo()を使えとのことだったので、getaddrinfo()について調べてみた。 getaddrinfo(3) #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *node, const char *service, const struct addrinfo *hint</netdb.h></sys/socket.h></sys/types.h>…
connect()で接続ができたら、write()関数でリクエストを送ります。 例 char buf[1024]; char *host; //ホスト名 host = "localhost"; /* 中略 */ //送信内容を作成 snprintf(buf, sizeof(buf), "GET / HTTP/1.0\r\nHost: %s\r\r\n", host); //リクエストを送…
write()でHTTPリクエストをサーバに送信したあとは、read()関数でサーバからのHTTPレスポンスを読み込みます。 例 //バッファを空に memset(buf, 0, sizeof(buf)); //レスポンスを受信して出力 do { //バッファ分読み込む n = read(sfd, buf, sizeof(buf)); …
connect()の実例 127.0.0.1(localhost)の80番ポートに接続する。 //connect_test.c #include <arpa/inet.h> #include <stdio.h> #include <unistd.h> int main(void) { int sockfd; struct sockaddr_in sockaddr; char *addr_str = "127.0.0.1"; //ソケットの生成 sockfd = socket(AF_INET, S</unistd.h></stdio.h></arpa/inet.h>…
connect()の書式 | connect(2) #include <sys/types.h> /* 移植性が必要な場合 */ #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); connect() システムコールは、ファイルディスクリプタ sockfd が参照しているソケットを addr で指</sys/socket.h></sys/types.h>…
ソケット(英: Socket)とは、BSD系UNIXを起源とするAPIであり、C言語によるアプリケーション開発でのプロセス間通信、特にコンピュータネットワークに関するライブラリを構成する。BSDソケット、バークレーソケットなどとも呼ばれる。1983年にリリースされ…
socket()の書式 #include <sys/types.h> /* 移植性を考慮する際は必要 */ #include <sys/socket.h> int socket(int domain, int type, int protocol); socket() は通信のための端点(endpoint)を作成し、ディスクリプター(descriptor)を返す。 成功した場合、新しいソケットのファイル・</sys/socket.h></sys/types.h>…
関数へのポインタも宣言できる。 関数へのポインタは、メモリ内にある関数の先頭アドレスを値としてもつ。 例 #include <stdio.h> void function1(void); int main (void) { void (*f)(void); //関数へのポインタを宣言 f = function1; //ポインタへ関数の先頭アドレ</stdio.h>…
配列の中にポインタを格納できる。 主な使用方法は「文字列の配列」。*1 例 #include <stdio.h> int main (void) { char *seasons[] = {"spring", "summer", "fall", "winter"}; int i,length; //配列の要素数を取得 length = sizeof seasons / sizeof seasons[0]; fo</stdio.h>…
ポインタと配列は相互変換できる int array[] = {10,20,30,40}; int *pointer; pointer = array; //pointにarrayの先頭アドレスが代入される //下記は同じ結果になる printf("%p\n", pointer); printf("%p\n", array); printf("%p\n", &array[0]); printf("%…
ポインタに対しては下記の演算ができる + - ++ -- ポインタに整数nを足した場合、ポインタが指しているオブジェクトのサイズxnがたされる。 例 #include <stdio.h> int main (void) { int n[] = {123, 245}; int *p; p = n; printf("address: %p\n",p); //address: </stdio.h>…
今日で4日目なわけなので、とりあえず三日坊主は避けられてちょっとほっとしております。 でも、毎日こんな遅くまで起きてはいられないので、ペースを考えないとですね。
gethostbyname()を使用したサンプルコードをつくってみた。 /* gethostbyname.c */ #include <stdio.h> #include <netdb.h> int main (int argc, char *argv[]) { //変数宣言 char *hostname; struct hostent *hostent; int i,j; char *err_mess = ""; //引数が空の場合は終了 </netdb.h></stdio.h>…
C初心者には難関といわれるポインタについて勉強したいとおもいます。 ポインタってなによ?? 僕がリファレンス的な教科書として使っている『C言語プログラミング』によると、 ポインタはメモリアドレスを値としてもつ変数 とのことです。ようするに、デー…
初期化 int型の配列を宣言(要素数10) int array[10]; 宣言と同時に値を設定 //指定されていない要素は0で初期化される int array[10] = {1,2,3,4,5}; //サイズを指定しないと指定した初期値の数だけ要素が確保される。この場合は要素数5。 int array[]…
□h_addr_listについて □ネットワークバイトオーダ形式ってなに? □そもそもC言語の配列ってどうなってるんだ? □ポインターってなんだったっけ? □gethostbyname()関数を使ったコードを自力で書く □getnameinfo()について
gethostbyname()って? manによると、名前解決をするための関数のようです。 #include <netdb.h> extern int h_errno; struct hostent *gethostbyname(const char *name); gethostbyname() 関数は与えられたホスト名 name に対応する構造体 hostent を返す。 引数の n</netdb.h>…
さて、HTTP Clientの動作フローですが、以下のようなものになっているようです。 1.gethostbyname()によりドメイン名からIPアドレスを引く 2.socket() によりソケットを開く 3.connect() によりサーバに接続する 4.write() でサーバにリクエストを送る 5.rea…
ねる前にひとつ成果をだして明日につなげようと思います。 まず、「C HTTP通信」とぐぐる ものすごく参考になりそうなページを発見。 [C言語]Socket間通信 HTTPクライアントを作る そしてコンパイル とりあえず、上記サイトに記載されていたコードを「http-c…
使用言語 C HelloWorldくらいしかCの経験はないのですが、30歳になったのでCでがんばりたいと思います。 動作環境 Linuxとりあえず、ノートに入っているOSがUbuntuなのでLinux上で動作するものをつくろうと思います。GUIのライブラリはGTK+がいいんだろうか?…
よくわかりませんが、ざっと想像してみたところ下記のようなかんじなんじゃないかと思います。 HTTPをしゃべる部分(UserAgent部) 取得したデータをパースする部分(パーサー部) 取得したデータを描画する部分(レンダリングエンジン部) ユーザインターフ…
なんでそんなことを思い立ったのか? 30歳になったらです。 「30にして立つ」ってやつです。 方針 30歳にもなると入門書読んだりとか基礎から一歩々々地道にやっていくのがけっこうしんどくなってきたりします。なので、とりあえずいきあたりばったりで作っ…