FUN C

様々なプログラムをC言語で書いていこうと思っています。

プロトタイプ宣言を別のファイルで行うのが少しめんどくさいので、

.cファイル自体に

#ifndef _HOGE 
#define _HOGE 
  
/* ぷろぐらむ */
  
#endif 

といった形で書き、二重でincludeされるのを防いでいます。


ちょくちょく注釈を入れている英語がおかしいのは勘弁ください。

2014年

2月

24日

utf16.c

UTF-8は、よく使われるものは小さいバイトで、そうでないものは大きなバイト(例えば日本語は3バイト)で表される符号化方法ですが、
UTF-16は、全て2バイト(でも文字が増えてしまって4バイトもたまにある)で符号化しています。
まあなんとなくしか理解していませんが、だいたいそんな感じです。

というわけで、UTF-16をUTF-8に変換するu16_u16tou8関数を作りました。(ほとんどどこかからのコピペなのですが…(汗))
続きを読む 0 コメント

2014年

2月

24日

json.c ー ②

JSON形式のデータを処理するためのプログラム、json.cです。

JSON形式についてはこちらをご参照。
http://json.org/json-ja.html
ここに書いてある通りに処理すればOKです。

このプログラムでは、おおまかにわけると
① json関係の構造体の構築
② 文字列情報からjson関係構造体への格納
を行います。

今回は②についてです。
全体のプログラムは最後に載せます。
続きを読む 0 コメント

2014年

2月

24日

json.c ー ①

JSON形式のデータを処理するためのプログラム、json.cです。

JSON形式についてはこちらをご参照。
http://json.org/json-ja.html
ここに書いてある通りに処理すればOKです。

このプログラムでは、おおまかにわけると
① json関係の構造体の構築
② 文字列情報からjson関係構造体への格納
を行います。

今回は①についてです。
全体のプログラムは次回に載せようと思います。
続きを読む 0 コメント

2014年

2月

24日

file.c ー ver.2

ちょいとここらで、ほとんど中身はないですがfile.cを更新しましたので、少し。

int file_make(char *filename, int overwrite)関数を作りました。
fileが存在してなければ作り、
存在してるとき、overwriteが1なら上書きして中身のないファイルにするものです。
続きを読む 0 コメント

2014年

2月

18日

twitter.c ー ②③

twitterAPI利用プログラム作成に向けて。

 

① httpメッセージの作成

② tcpでtwitterAPI提供サーバにつなぎ、(https用ポート)sslコネクションも作る

③ リクエストの送信

④ RestAPIではメッセージを全て受信し、解析

  StreamingAPIではメッセージを随時読み込み、解析

 


なお、全て説明したら全体のソースコードも掲載する予定です。

続きを読む 0 コメント

2014年

2月

18日

http.c ー ver.2

http.cを使ってて思ったのですが、ファイル送信終了をお知らせしてくれない時には6秒のタイムアウトを待つしかなく、なかなか不便です。
というわけで

① http_getsize_fromheader 関数を作り、headerを受け取って、そこからContent-Lengthフィールドを探しだしデータの大きさを返す。
① http_msggetの中身を変え、headerを受信し、上の関数でデータの大きさをGETし、それをhttp_recv_allに渡す。
② http_recv_allで、目的のサイズ受信したら終了する処理を加える

ことにより、ちと便利になりました。
しかしなかなかごっちゃかめっちゃかで、もうちと綺麗なプログラムにしたいものです。

ひとまずver.2のソースを下に載せます。
続きを読む 0 コメント

2014年

2月

15日

http.c

さて、ここらでようやくhttp.cです。
こいつの主要な機能は

 ① httpメッセージの作成補助および作成
 ② 適切なポートへのtcp(over ssl)接続の確立

です。
指定されたホスト、ポートへの接続は、connect.cに任せているのですが、
こいつでhttpだろうとhttpsだろうと同じように扱えるように作ってみました。

なお、ver.2ができましたので、ソースはそちらをどうぞ。
続きを読む 2 コメント

2014年

2月

15日

file.c

file.cは、file関係、いちいちfopenしてごにょごにょしてfcloseするのがめんどくさいな… と思った結果誕生しました。 
いまのところ、入ってる関数は 
① ファイルの存在を確認する、int file_exist(char *filename) 
② ファイルのサイズを取得する、int file_getsize(char *filename) 
③ ファイルから一行分読み込む、int file_gets(char *filename, char *s, int size)
④ ファイルに書き込む、int file_puts(char *filename, char *s, int size)
です。

file.c ー ver.2ができましたのでそちらも。
続きを読む 0 コメント

2014年

2月

14日

wait.c

はい、いつものように、突然のよくわからないものです。

でもこれが結構大事で、
wait.c内に、ファイルディスクリプタを指定時間監視し、入力または出力があったら1を返し、指定時間経過してもなければ0を返す、
そんなwait関数を作っております。
ファイルディスクリプタという事は、もちろん0(標準入力)や、1(標準出力)にも使えますし、
特に使いやすいのがTCP接続なんかでのソケットの監視です。
ファイルディスクリプタと同様にして、そのソケットに入力があるかどうか、指定時間監視できる、
つまりタイムアウトなんかに使えます。
続きを読む 0 コメント

2014年

2月

14日

connect.c

さて、いよいよソケットプログラミングに入ります。
これさえあれば、TCP接続で好きなアドレスになにかを送ったり、
また、それと同じようにしてSSLの暗号化通信もできるようになります。

作る関数としましては、

 ① アドレス(char *型、"google.com"など)→IPアドレス情報(struct in_addr型)変換するcon_atoaddr関数
 ② ①を使いつつ、アドレスとポートを引数としてそこにTCP接続を確立しソケット(int型)を返す、con_tcp関数
 ③ ソケットを引数として、over SSLしたやつ(SSL *型)を返す、con_ssl関数
 ④ ②、③を使い、host,port,sslかどうかを引数として受け取り、接続を確立した後ソケットおよびSSL *(sslでないときはNULL)を返す、con_connect関数
 ⑤ ソケットおよびSSL *を受け取り、SSL *がNULLでなければssl通信、NULLなら普通のtcpのみの通信を行い、引数にとったデータを送る、con_send関数
 ⑥ 同様にしてうまいこと受け取るcon_recv関数
 ⑦ これもまたうまいことconnectionを閉じる、con_close関数

となります。
続きを読む 1 コメント