socket - 抽象化されたソケット入出力

------------------------------------------------------------------------------
typedef enum
{
	CONN_READY,
	CONN_LOOKUPSUCCESS,
	CONN_ESTABLISHED,
	CONN_LOOKUPFAILED,
	CONN_FAILED
} ConnectionState;

接続状態を表す enum です。

------------------------------------------------------------------------------
typedef gint (*SockConnectFunc)		(SockInfo	*sock,
					 gpointer	 data);

sock_connect_async() で接続が確立したときに呼ばれるコールバック関数の型です。

------------------------------------------------------------------------------
typedef gboolean (*SockFunc)		(SockInfo	*sock,
					 GIOCondition	 condition,
					 gpointer	 data);

sock_add_watch() でソケットを監視する際に呼ばれるコールバック関数の型です。

------------------------------------------------------------------------------
SockInfo

struct _SockInfo
{
	gint sock;
#if USE_SSL
	SSL *ssl;
#endif
	GIOChannel *sock_ch;

	gchar *hostname;
	gushort port;
	ConnectionState state;
	gboolean nonblock;
	gpointer data;

	SockFunc callback;
	GIOCondition condition;
};

SSL を含めたソケットを抽象的に扱うための構造体です。

------------------------------------------------------------------------------
gint sock_init				(void);

ソケットライブラリを初期化します。
Win32 では WinSock ライブラリを初期化します。 Unix 系 OS では何もしません。

戻り値: 成功した場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_cleanup			(void);

ソケットライブラリをクリーンアップします。
Win32 では WinSock ライブラリのクリーンアップを行います。
Unix 系 OS では何もしません。

戻り値: 成功した場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_set_io_timeout		(guint sec);

ソケットの I/O タイムアウトを sec 秒に設定します。

sec: タイムアウトの秒数
戻り値: 常に 0 が返ります。

------------------------------------------------------------------------------
gint sock_set_nonblocking_mode		(SockInfo *sock, gboolean nonblock);

nonblock が TRUE の場合、ソケット sock を非ブロッキングモードに設定します。
nonblock が FALSE の場合はブロッキングモードに設定します。

sock: SockInfo オブジェクト
nonblock: TRUE の場合非ブロッキングモードに設定
          FALSE の場合ブロッキングモードに設定
戻り値: 成功した場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gboolean sock_is_nonblocking_mode	(SockInfo *sock);

ソケット sock が非ブロッキングモードの場合 TRUE を返します。

sock: SockInfo オブジェクト
戻り値: sock が非ブロッキングモードの場合 TRUE
        ブロッキングモード、またはエラーの場合 FALSE

------------------------------------------------------------------------------
gboolean sock_has_read_data		(SockInfo *sock);

ソケット sock に既にデータが到着しているかどうかを調べ、到着していれば TRUE
を返します。ただし、 Win32 プラットフォームで通常のソケットの場合のみ有効
です。それ以外の場合は常に TRUE を返します。

sock: SockInfo オブジェクト
戻り値: sock にデータが到着している場合 TRUE
        到着していない場合 FALSE

------------------------------------------------------------------------------
guint sock_add_watch			(SockInfo *sock, GIOCondition condition,
					 SockFunc func, gpointer data);

ソケット sock を GLib のイベントループ下で監視します。
sock に I/O の状態 condition に一致する変化があった場合、コールバック関数
func が呼ばれます。 func の引数には sock, condition, data が渡されます。

監視を停止する場合は、戻り値を引数にして g_source_remove() を呼びます。

sock: SockInfo オブジェクト
condition: ソケットの I/O の状態
func: SockFunc 型のコールバック関数
data: func に渡されるユーザデータ
戻り値: GSource の ID

------------------------------------------------------------------------------
struct hostent *my_gethostbyname	(const gchar *hostname);

タイムアウト付きの gethostbyname() 関数です。 sock_set_io_timeout() で
設定したタイムアウト時間が経過した場合、強制的に gethostbyname() を
タイムアウトさせて返ります。 Win32 の場合は通常の gethostbyname() と
同等です。

hostname: ホスト名文字列
戻り値: hostent 構造体へのポインタ

------------------------------------------------------------------------------
SockInfo *sock_connect			(const gchar *hostname, gushort port);

ホスト hostname のポート番号 port に接続し、 SockInfo オブジェクトを返します。

返ったソケットは sock_close() で閉じて解放する必要があります。

hostname: ホスト名文字列
port: ポート番号
戻り値: SockInfo オブジェクト

------------------------------------------------------------------------------
gint sock_connect_async			(const gchar *hostname, gushort port,
					 SockConnectFunc func, gpointer data);

ホスト hostname のポート番号 port に非同期で接続します。
接続が完了した時点でコールバック関数 func が呼ばれます。
現在は Unix 系 OS のみ使用可能です。

hostname: ホスト名文字列
port: ポート番号
func: 接続が完了したときに呼ばれるコールバック関数
data: func に渡されるユーザデータ
戻り値: 成功した場合接続セッションの ID (> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_connect_async_cancel		(gint id);

sock_connect_async() で処理中のセッションを接続が完了する前にキャンセル
します。引数には sock_connect_async() の戻り値を渡します。
現在は Unix 系 OS のみ使用可能です。

id: 接続セッション ID
戻り値: 成功した場合 0
        該当するセッションが存在しない場合 -1

------------------------------------------------------------------------------
gint sock_printf	(SockInfo *sock, const gchar *format, ...)

printf フォーマット文字列をソケット sock に送信します。

sock: SockInfo オブジェクト
format: printf フォーマット文字列
戻り値: 成功した場合書き込んだバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_read		(SockInfo *sock, gchar *buf, gint len);

ソケット sock からデータを最大 len バイト受信し、 buf に格納します。
読み込んだデータのサイズは len より小さい場合があります。

sock: SockInfo オブジェクト
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        EOF の場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_write		(SockInfo *sock, const gchar *buf, gint len);

ソケット sock に buf にあるデータを最大 len バイト送信します。
送信したデータのサイズは len より小さい場合があります。

sock: SockInfo オブジェクト
buf: 送信するデータを格納するバッファ
len: 送信するデータのサイズ
戻り値: 成功した場合送信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_write_all	(SockInfo *sock, const gchar *buf, gint len);

ソケット sock に buf にあるデータを必ず len バイト送信します。
送信したデータが len より少ない場合は、 len に到達するまで送信を続けます。

sock: SockInfo オブジェクト
buf: 送信するデータを格納するバッファ
len: 送信するデータのサイズ
戻り値: 成功した場合送信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_gets		(SockInfo *sock, gchar *buf, gint len);

ソケット sock から1行(次の LF コードまで)読み込みます。
1行が len - 1 より長い場合は len - 1 までのサイズのデータが読み込まれます。
データの最後は必ずヌル文字で終端されます。

sock: SockInfo オブジェクト
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_getline	(SockInfo *sock, gchar **line);

ソケット sock から1行(次の LF コードまで)読み込みます。
動的にメモリを確保し、データを格納して返します。
データの最後は必ずヌル文字で終端されます。

sock: SockInfo オブジェクト
line: 受信したデータを格納する領域へのポインタを返すためのポインタ
戻り値: 成功した場合受信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_puts		(SockInfo *sock, const gchar *buf);

ソケット sock に文字列 buf を送信し、さらに改行(CR+LF)を出力します。
buf の全てのデータが送信されることが保証されます。

sock: SockInfo オブジェクト
buf: 送信する文字列
戻り値: 成功した場合最後に送信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_peek		(SockInfo *sock, gchar *buf, gint len);

ソケット sock から内部のバッファをクリアせずにデータを読み出します。
データを最大 len バイト受信し、 buf に格納します。
読み込んだデータのサイズは len より小さい場合があります。

sock: SockInfo オブジェクト
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        EOF の場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gint sock_close		(SockInfo *sock);

ソケット sock をクローズし、メモリを解放します。

sock: SockInfo オブジェクト
戻り値: 常に 0

------------------------------------------------------------------------------
gint fd_connect_inet	(gushort port);

ローカルホストのポート番号 port のソケットに接続します。

port: ポート番号
戻り値: ソケットのファイルデスクリプタ

------------------------------------------------------------------------------
gint fd_open_inet	(gushort port);

ローカルホストのポート番号 port のソケットを開いて接続を待ち受けます。

port: ポート番号
戻り値: ソケットのファイルデスクリプタ

------------------------------------------------------------------------------
gint fd_connect_unix	(const gchar *path);

パスが path となる Unix ドメインソケットに接続します。
Unix 系 OS のみ利用可能です。 Win32 では常に -1 を返します。

path: Unix ドメインソケットのパス
戻り値: ソケットのファイルデスクリプタ

------------------------------------------------------------------------------
gint fd_open_unix	(const gchar *path);

パスが path となる Unix ドメインソケットを開いて接続を待ち受けます。
Unix 系 OS のみ利用可能です。 Win32 では常に -1 を返します。

path: Unix ドメインソケットのパス
戻り値: ソケットのファイルデスクリプタ

------------------------------------------------------------------------------
gint fd_accept		(gint sock);

ソケットへの接続を受け付けます。

sock: ソケットのデスクリプタ
戻り値: 成功した場合新しいソケットのデスクリプタ
        エラーの場合 -1

------------------------------------------------------------------------------
gint fd_read		(gint sock, gchar *buf, gint len);

ファイルデスクリプタ sock からデータを最大 len バイト受信し、 buf に格納します。
読み込んだデータのサイズは len より小さい場合があります。

sock: ファイルデスクリプタ
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        EOF の場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gint fd_write		(gint sock, const gchar *buf, gint len);

ファイルデスクリプタ sock に buf にあるデータを最大 len バイト送信します。
送信したデータのサイズは len より小さい場合があります。

sock: ファイルデスクリプタ
buf: 送信するデータを格納するバッファ
len: 送信するデータのサイズ
戻り値: 成功した場合送信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint fd_write_all	(gint sock, const gchar *buf, gint len);

ファイルデスクリプタ sock に buf にあるデータを必ず len バイト送信します。
送信したデータが len より少ない場合は、 len に到達するまで送信を続けます。

sock: ファイルデスクリプタ
buf: 送信するデータを格納するバッファ
len: 送信するデータのサイズ
戻り値: 成功した場合送信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint fd_gets		(gint sock, gchar *buf, gint len);

ファイルデスクリプタ sock から1行(次の LF コードまで)読み込みます。
1行が len - 1 より長い場合は len - 1 までのサイズのデータが読み込まれます。
データの最後は必ずヌル文字で終端されます。

sock: ファイルデスクリプタ
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint fd_getline		(gint sock, gchar **line);

ファイルデスクリプタ sock から1行(次の LF コードまで)読み込みます。
動的にメモリを確保し、データを格納して返します。
データの最後は必ずヌル文字で終端されます。

sock: ファイルデスクリプタ
line: 受信したデータを格納する領域へのポインタを返すためのポインタ
戻り値: 成功した場合受信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint fd_close		(gint sock);

ファイルデスクリプタ sock をクローズし、リソースを解放します。

sock: ファイルデスクリプタ
戻り値: 成功した場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gint ssl_read		(SSL *ssl, gchar *buf, gint len);

SSL ssl からデータを最大 len バイト受信し、 buf に格納します。
読み込んだデータのサイズは len より小さい場合があります。
OpenSSL をリンクしている場合のみ利用可能です。

ssl: SSL
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        EOF の場合 0
        エラーの場合 -1

------------------------------------------------------------------------------
gint ssl_write		(SSL *ssl, const gchar *buf, gint len);

SSL ssl に buf にあるデータを最大 len バイト送信します。
送信したデータのサイズは len より小さい場合があります。
OpenSSL をリンクしている場合のみ利用可能です。

ssl: SSL
buf: 送信するデータを格納するバッファ
len: 送信するデータのサイズ
戻り値: 成功した場合送信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint ssl_write_all	(SSL *ssl, const gchar *buf, gint len);

SSL ssl に buf にあるデータを必ず len バイト送信します。
送信したデータが len より少ない場合は、 len に到達するまで送信を続けます。
OpenSSL をリンクしている場合のみ利用可能です。

ssl: SSL
buf: 送信するデータを格納するバッファ
len: 送信するデータのサイズ
戻り値: 成功した場合送信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint ssl_gets		(SSL *ssl, gchar *buf, gint len);

SSL ssl から1行(次の LF コードまで)読み込みます。
1行が len - 1 より長い場合は len - 1 までのサイズのデータが読み込まれます。
データの最後は必ずヌル文字で終端されます。
OpenSSL をリンクしている場合のみ利用可能です。

ssl: SSL
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint ssl_getline	(SSL *ssl, gchar **line);

SSL ssl から1行(次の LF コードまで)読み込みます。
動的にメモリを確保し、データを格納して返します。
データの最後は必ずヌル文字で終端されます。
OpenSSL をリンクしている場合のみ利用可能です。

ssl: SSL
line: 受信したデータを格納する領域へのポインタを返すためのポインタ
戻り値: 成功した場合受信したバイト数(> 0)
        エラーの場合 -1

------------------------------------------------------------------------------
gint ssl_peek		(SSL *ssl, gchar *buf, gint len);

SSL ssl から内部のバッファをクリアせずにデータを読み出します。
データを最大 len バイト受信し、 buf に格納します。
読み込んだデータのサイズは len より小さい場合があります。
OpenSSL をリンクしている場合のみ利用可能です。

ssl: SSL
buf: 受信したデータを格納するバッファ
len: 受信する最大サイズ
戻り値: 成功した場合受信したバイト数(> 0)
        EOF の場合 0
        エラーの場合 -1
