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