split_text の Manpage風解説

c

名前 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…

文字列分割用ライブラリを勉強の為に書いてみた

C

URLパーサをつくるときに文字列分割用にstrtok_r()関数を利用したのだけど、なんかしっくりとこなかった(ただの勉強不足なわけですが...)ので勉強の為にも文字列分割ライブラリをつくってみた。 今回勉強になったもの ユーザー関数 構造体による連結リスト…

次にやること

URLパーサを自作ライブラリの split_text() をつかって書き換える useragentのURL対応 useragentのファイル保存対応 Makeファイルの導入

HTTP Client の動作フロー その9 : useragent.c

今まで勉強したことのまとめとして、指定ホストのトップページを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>…

日本語も勉強しないと...

ブログを書き始めて感じたこと。 伝えたい内容を簡潔にまとめる能力をもっとつけないといけない。特にソースコード中のコメントとか、バージョン管理システムにコミットするときのメッセージをもっとわかりやすく書けるようになりたい。昔はもっとちゃんとし…

libcurlが参考になるかも

HTTP Clientですが、libcurlが参考になりそう。MITラインセスってのがいいですね。

オープンソースのコードを取り込んだ時のライセンス表記について

GPLのコードを1行でも取り込んだ場合は、ソフトウェア全体をGPLで配布しなければいけませんが、BSDやMITライセンスのコードを一部取り込んだ場合のライセンス表記ってどうなってるんだろう?と思っていろいろ調べてみた。BSDライセンスに関しては、Wikipedi…

URLパーサをつくってみた

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>…

HTTP Client の動作フロー その6 : getaddrinfo()

名前解決には、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>…

HTTP Client の動作フロー その7 : write() でリクエストを送る

connect()で接続ができたら、write()関数でリクエストを送ります。 例 char buf[1024]; char *host; //ホスト名 host = "localhost"; /* 中略 */ //送信内容を作成 snprintf(buf, sizeof(buf), "GET / HTTP/1.0\r\nHost: %s\r\r\n", host); //リクエストを送…

HTTP Client の動作フロー その8 : read() でレスポンスを読み込む

write()でHTTPリクエストをサーバに送信したあとは、read()関数でサーバからのHTTPレスポンスを読み込みます。 例 //バッファを空に memset(buf, 0, sizeof(buf)); //レスポンスを受信して出力 do { //バッファ分読み込む n = read(sfd, buf, sizeof(buf)); …

HTTP Client の動作フロー その5 : connect() でサーバに接続する [2]

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>…

HTTP Client の動作フロー その4 : connect() でサーバに接続する

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>…

ソケットってそもそもなんだ?

C

ソケット(英: Socket)とは、BSD系UNIXを起源とするAPIであり、C言語によるアプリケーション開発でのプロセス間通信、特にコンピュータネットワークに関するライブラリを構成する。BSDソケット、バークレーソケットなどとも呼ばれる。1983年にリリースされ…

HTTP Client の動作フロー その3 : socket() でソケットを開く

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>…

関数へのポインタ

C

関数へのポインタも宣言できる。 関数へのポインタは、メモリ内にある関数の先頭アドレスを値としてもつ。 例 #include <stdio.h> void function1(void); int main (void) { void (*f)(void); //関数へのポインタを宣言 f = function1; //ポインタへ関数の先頭アドレ</stdio.h>…

ポインタの配列

C

配列の中にポインタを格納できる。 主な使用方法は「文字列の配列」。*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>…

ポインタと配列

C

ポインタと配列は相互変換できる 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("%…

ポインタの演算

C

ポインタに対しては下記の演算ができる + - ++ -- ポインタに整数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日目なわけなので、とりあえず三日坊主は避けられてちょっとほっとしております。 でも、毎日こんな遅くまで起きてはいられないので、ペースを考えないとですね。

HTTP Client の動作フロー その2 : gethostbyname() の実例

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>…

ポインタについて(1) 概要・宣言・代入・参照

C

C初心者には難関といわれるポインタについて勉強したいとおもいます。 ポインタってなによ?? 僕がリファレンス的な教科書として使っている『C言語プログラミング』によると、 ポインタはメモリアドレスを値としてもつ変数 とのことです。ようするに、デー…

C言語の配列について

C

初期化 int型の配列を宣言(要素数10) int array[10]; 宣言と同時に値を設定 //指定されていない要素は0で初期化される int array[10] = {1,2,3,4,5}; //サイズを指定しないと指定した初期値の数だけ要素が確保される。この場合は要素数5。 int array[]…

後日調べること&やる事 20110511

□h_addr_listについて □ネットワークバイトオーダ形式ってなに? □そもそもC言語の配列ってどうなってるんだ? □ポインターってなんだったっけ? □gethostbyname()関数を使ったコードを自力で書く □getnameinfo()について

HTTP Client の動作フロー その1 : gethostbyname()

gethostbyname()って? manによると、名前解決をするための関数のようです。 #include <netdb.h> extern int h_errno; struct hostent *gethostbyname(const char *name); gethostbyname() 関数は与えられたホスト名 name に対応する構造体 hostent を返す。 引数の n</netdb.h>…

HTTP Client の動作フロー

さて、HTTP Clientの動作フローですが、以下のようなものになっているようです。 1.gethostbyname()によりドメイン名からIPアドレスを引く 2.socket() によりソケットを開く 3.connect() によりサーバに接続する 4.write() でサーバにリクエストを送る 5.rea…

さっそく、HTTPをしゃべるプログラムをつくってみる

ねる前にひとつ成果をだして明日につなげようと思います。 まず、「C HTTP通信」とぐぐる ものすごく参考になりそうなページを発見。 [C言語]Socket間通信 HTTPクライアントを作る そしてコンパイル とりあえず、上記サイトに記載されていたコードを「http-c…

使用言語とか動作環境とか

使用言語 C HelloWorldくらいしかCの経験はないのですが、30歳になったのでCでがんばりたいと思います。 動作環境 Linuxとりあえず、ノートに入っているOSがUbuntuなのでLinux上で動作するものをつくろうと思います。GUIのライブラリはGTK+がいいんだろうか?…

とりあえず、ブラウザってどんな構造なんだ?

よくわかりませんが、ざっと想像してみたところ下記のようなかんじなんじゃないかと思います。 HTTPをしゃべる部分(UserAgent部) 取得したデータをパースする部分(パーサー部) 取得したデータを描画する部分(レンダリングエンジン部) ユーザインターフ…

30歳になったのでゼロからブラウザをつくろうと思います

なんでそんなことを思い立ったのか? 30歳になったらです。 「30にして立つ」ってやつです。 方針 30歳にもなると入門書読んだりとか基礎から一歩々々地道にやっていくのがけっこうしんどくなってきたりします。なので、とりあえずいきあたりばったりで作っ…