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);

使用例


変更履歴