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