TCP stream socket 用 C function library
(c) Copyright 2007, Hirofumi Fujii
(01-Oct-2008 Version 1b)
(27-Dec-2007 Version 1a)
はじめに
tcplib.c は TCP stream socket を扱うための C の function library である。
Windows の場合はWINSOCK2 を使うので ws2_32.lib を link すること。
C で compile して C++ で使う場合は
extern "C"
{
#include "tcplib.h"
}
とするのを忘れないこと。
Windows の場合、XP 以上であれば thread safe である関数 getaddrinfo() を使うように
指定することができる。この場合、_WIN32_WINNT は 0x0501 以上を指定する。
例えば exam01.c を gcc で XP 以上用 getaddrinfo() を使うように compile/link するには
gcc -DWIN32 -D_WIN32_WINNT=0x0501 exam01.c tcplib.c -lws2_32 -oexam01.exe
などとする。
使用法
Network library の start
まず、network library を start する。
Windows の場合は WINSOCK2 が呼ばれる。Linux の場合は必要無く、あっても dummy 関数が呼ばれるだけである。
netlibstart()
戻り値は 0 が正常、-1 がエラーである。なお、この library の終了は
netlibstop()
である。
Socket の生成
次に tcp 用の socket を生成する。戻り値は SOCKET 型である。
(Linux では tcplib.h で int 型に定義してある)。
SOCKET sd;
sd = tcpsocket();
エラーの場合は INVALID_SOCKET が返る。これ以降、標準の socket libary 関数の socket descriptor と
して使うことができる。
接続
上で述べたように、socket descriptor が与えられているので、標準 socket library の
connect() や listen() 関数をそのまま使うことができる。ただし、これらの関数は address の設定など面倒な
手続きが必要なので、接続関連で以下の二つの関数を用意した。
Client として接続したければ
int tcpopen(SOCKET sd, const char* host, int port);
Server として接続待ちにしたければ
int tcplisten(SOCKET sd, int port, int backlog);
を呼び出す。いずれもエラー時には (-1) が返る。
入出力
入出力も同様に、標準 socket libary の send() や recv() 関数を使うことができる。ただし、これらは
エラーで無くとも途中で戻ることがある。通常のファイル入出力同様に指定したサイズの入出力が完了する
まで戻らない関数を用意した。
int tcpread(SOCKET sd, char* buf, int nbytes);
int tcpwrite(SOCKET sd, const char* buf, int nbytes);
Socket の close
これも Linux の場合は close() 、Windows の場合は closesocket() を呼び出すだけであるが、一応、
以下の関数を用意した。
int tcpclose(SOCKET sd);
使用例
変更履歴
- 04-Oct-2008: exam03.c を追加。Web ページ整備。
- 01-Oct-2008: tcplib.c に <string.h> を加えた。memset の宣言のために必要(忘れていた)。