UserAgent

次にやること

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ラインセスってのがいいですね。

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

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

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

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…