LINUX・FreeBSDでの情報
実践編のサンプルプログラムはSolaris上で作成・テストしたもので、そのままではLINUX・FreeBSDではコンパイルが通らない場所があります。インクルードファイルなどちょっとした変更なのですが、念のため変更箇所をお知らせします。
LINUX
サーバ
main.c
・インクルードファイルの追加:MAXHOSTNAMELENがコンパイル時にアンデファインになります。
#include <sys/param.h>・MainLoop()のクライアントのIPアドレス取得の変更:struct sockaddr_inの内容が異なります。
union{ unsigned int i; unsigned char c[4]; }i_c;という共用体を定義し、
sprintf(client_address,"%d.%d.%d.%d",from.sin_addr.S_un.S_un_b.s_b1, from.sin_addr.S_un.S_un_b.s_b2, from.sin_addr.S_un.S_un_b.s_b3, from.sin_addr.S_un.S_un_b.s_b4);のかわりに、
i_c.i=from.sin_addr.s_addr; sprintf(client_address,"%d.%d.%d.%d",i_c.c[0],i_c.c[1],i_c.c[2],i_c.c[3]);とします。
child.c
・インクルードファイルの追加:struct timevalの定義が不足します。
#include <sys/time.h>
Makefile
・LDFLAGSの変更:-lsocket -lxnetは不要です。
LDFLAGS=
クライアント
main.c
・インクルードファイルの追加:strstr()の定義が無いため警告が出る:string.hの追加
#inclue <string.h>・インクルードファイルの追加:struct timevalの定義が不足します。
#include <sys/time.h>・インクルードファイルの削除:存在しないファイルです。
#include <sys/termio.h>削除・なお、va_startの定義がvarargs.hとstdarg.hで異なるという警告が出ますが、このままで動きます。ただ、curses.hよりvarargs.hを先にインクルードするとcurses.hからインクルードされるstdarg.hの定義のva_startと異なるのでエラーとなります。
socket.c
・インクルードファイルの追加:struct timevalの定義が不足します。
#include <sys/time.h>
Makefile
・LDFLAGSの変更:-lsocket -lxnetは不要です。
LDFLAGS=-lcurses
FreeBSD
次にFreeBSDへの対応方法です。私の使える環境であるFreeBSD 2.2.1では、lockf()がありませんでした。サーバのファイルのロックが実現できませんので、他の方法に変更する必要があります。それ以外はLINUXへの対応+以下の方法で使えます。
サーバ
main.c
・シグナル名の変更:SIGCLDではなく、SIGCHLDという定義名です。ソース中のSIGCLDを全てSIGCHLDにします。
lock.c
・lockf()がありませんので、他の方法を検討してみてください。
クライアント
main.c
・インクルードファイルの削除:termio.hがありません。
#include <termio.h>削除
・インクルードファイルの変更:cursesではなく、ncursesでないと機能が足りません。
#include <curses.h>を#include <ncurses.h>に変更
Makefile
・LDFLAGSの変更:ncursesにします。
LDFLAGS=-lncurses
全般
end
FreeBSDの標準ライブラリ(libc)にはendというシンボル名が使われております。実践編のクライアントなどで、endと言う関数名を使用してしまっていますので、FreeBSDでは関数名を変更してお使いください。(読者の松島さまからの情報です。ありがとうございます。)
from 2000/9/13