【ただの技術備忘録】【第4回】LinuxC、ソケットプログラミング〜解説編1〜

まずはサーバ側から。変数、ヘッダファイルは後で解説。
1.socket(システムコール)でソケットを作成する。

#include <sys/types.h>
#include <sys/socket.h>
socket(int domain, int type, int protocol);

作成されたソケットは、通信の片方の端点になる。引数domainはアドレスの種類を指定し、引数typeには使用する通信のタイプを指定する。protocolには使用するプロトコルを指定する。

【ソケットのドメイン】
 ドメインというと、example.comのようなURLを思い浮かべそうになるが、
ココで言うドメインとは「ソケット通信で利用するネットワーク媒体」のこと。

?_?ナンノコッチャ

 代表的なソケットドメインはAF_INETで、コレはIP(インターネットプロトコル)
を指す。その他、UNIXで利用するUNIXファイルシステムドメインのAF_UNIX、
AppletalkDDPを指すAF_APPLETALKなどがある。普通はAF_INETで十分だと思うが、
一応以下に一覧。AFとPFだけの違いもあるが、受け渡し先が違うだけで、
基本どちらでもいいらしい。ココはチョット勉強不足。

 1.AF_INET:ARPAインターネットプロトコル
 2.AF_UNIX:UNIXファイルシステムドメイン
 3.AF_ISO:ISO標準プロトコル
 4.AF_NS:XeroxNetworkSystemsプロトコル
 5.AF_IPX:NovellIPXプロトコル
 6.AF_APPLETALK:AppletalkDDP
 7.PF_INET:IPv4 AF_INETとほぼ同義
 8.PF_INET6:IPv6 
 9.PF_IPX:IPX - Novell プロトコル
10.PF_NETLINK:カーネル・ユーザ・デバイス
11.PF_X25:ITU-T X.25 / ISO-8208 プロトコル
12.PF_AX25:アマチュア無線 AX.25 プロトコル
13.PF_ATMPVC:生の ATM PVC にアクセスする
14.PF_APPLETALK:アップルトーク
15.PF_PACKET:低レベルのパケットインターフェース
【ソケットのタイプ】
 AF_INETなどのネットワークドメインは通信手段が複数用意されているので、
それをソケットのタイプで指定する。指定できるのはストリームと
データグラムの二つのタイプ。
 AF_INETドメインでSOCK_STREAMを引数に渡すとTCP/IP接続で実装される。
SOCK_DGRAMという引数を渡すとUDP/IP接続で実装される。
 前者はストリームソケットタイプ、後者はデータグラムソケットタイプである。
どっちで実装するかは用法をお考えの上正しく活用することをお勧め。
【ソケットのプロトコル】
基本0。調べてもあまり出てこない。そのうち書こう。

今回の場合、

server_sockfd = socket(AF_INET,SOCK_STREAM ,0);

で指定しているので、AF_INET(IPV4)でTCP/IPのソケットを生成したことになる。
次回は、生成したソケットに命名する流れ。

【ただの技術備忘録】サイトの移植のときとかに引っかかりそうな罠(自分だけ)

テストサーバから本番サーバへサイトの移行。
テストサーバは自分で組んだが、
本番サーバは誰が組んだのか酷い仕様である。
が、既にサービスが動いているので致しかたない。
順当にディレクトリを作って移動。

トップページを見に行くと・・・

[Tue Oct 13 14:18:29 2009] [crit] [client *.*.***.**] 
(13)Permission denied: /home/hoge/.htaccess pcfg_openfile:
 unable to check htaccess file, ensure it is readable

あふぅん。
権限がおかしいらしい。
再度チェックすると、ディレクトリのother権限が0だったので実行権限を付加。

で、実行すると

[client *.*.***.**] PHP Parse error:  parse error,
 unexpected T_STRING in /home/hoge/wwwroot/htdocs/index.html on line 1

ええい、猪口才な。
index.htmlの一行目?
(因みに、このサイトではphpを介してhtmlファイルを読み込んでいる。MVCFWを使用するとかえって邪魔くさい。何かいい案がないかと思案中。)
さて、肝心のindex.htmlの一行目だが

<?xml version="1.0" encoding="Shift-jis"?>

ぬぬぅん。普通だぜ。何の変哲もない構文だ。
よく見るとParseエラー?PHPの構文がおかしいのか?

結論から行くとphp.iniのshort_open_tagがonになっていることが原因。
コレがonだと

<?php <?xml〜〜

と言った感じの構文の場合に、xml宣言がphpタグとして認識される。
なるほど、確かにテストサーバではOnにしていない。
とはいえ、うちのサーバーはバーチャルで色々動かしているのでphp.iniは弄りたくない。
ということで.htaccess

php_value short_open_tag "Off"

と書いて終了。
因みに、Offにした場合の弊害として

<? echo ** ?>

と言った構文が使えず、必ず

<?php echo ** ?>

としなければならない。個人的には、PHPを使うことを明示的に宣言してるので好ましいのだが、コーディングの際面倒ということも考えられる。その辺の裁量は各々方にお任せしたい。

【ただの技術備忘録】qmailエラー warning: trouble opening を解決するために出来ること

朝にメールのlogを見たら変なメッセージが。

Oct  9 10:43:48 hoge qmail: 1255052628.654080 warning: trouble opening remo
te/11/13468282; will try again later
Oct  9 10:43:48 hoge qmail: 1255052628.654101 warning: trouble opening remo
te/7/13468048; will try again later
Oct  9 10:43:48 hoge qmail: 1255052628.654121 warning: trouble opening remo
te/9/13468349; will try again later
Oct  9 10:43:48 hoge qmail: 1255052628.654142 warning: trouble opening remo
te/21/13468223; will try again later
Oct  9 10:43:48 hoge qmail: 1255052628.654163 warning: trouble opening remo
te/5/13468092; will try again later

なんじゃこりゃ。

心配になって調べてみると、どうやら「/var/qmail/queue」以下を手動で弄ったりすると整合性が取れなくて癇癪を起こすらしい。
難儀なヤツだ。男なら少々違ってても気合でどうにかするぐらいの気概が欲しい。
まぁ、鯖は女の子だと思ってるけど。
まぁ、女の子なので手間を掛けてあげる。
どうやらqueue-fixという化粧品があるらしい。
試してみよう。

# wget http://www.netmeridian.com/e-huss/queue-fix.tar.gz
# tar zxvf queue-fix.tar.gz
# cd queue-fix-1.4/
# make
/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non
-TLS reference in queue-fix.o
/lib/libc.so.6: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
make: *** [queue-fix] エラー 1

拒否反応。
コレが出るときは大体「error.h」に、
「extern int errno;」
が入ってるのは過去の結果から予想済み。

# vi error.h
//extern int errno;
#include <errno.h>

コメントアウトするのはなんとなく癖。
消すのが怖いんだもの。

# make clean
# make

/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non
-TLS reference in queue-fix.o
/lib/libc.so.6: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
make: *** [queue-fix] エラー 1

コッチミンナ。

どうやら正常にerrno.hが読み込まれていない模様。
コンパイルオプションに「--include /usr/include/errno.h」を追加する。
巷だと「-include /usr/include/errno.h」で表記しているところもあるが、真相は不明。
で、追加するファイルは「conf-cc」ファイル。他のは自動生成のヤツなので触っても無駄。

# vi conf-cc
gcc -O2 --include /usr/include/errno.h

# make clean
# make

おk、無事通った。
qmailの停止とqueue-fixの起動、qmailの起動を行う。

# /etc/rc.d/init.d/qmail stop
# rm -rf /var/qmail/queue/*
# ./queue-fix /var/qmail/queue/
# /etc/rc.d/init.d/qmail start

logを確認したら大丈夫だった。

【ただの技術備忘録】Centos5.3でPHP5.3のssh2関数を使用可能にするなど

手っ取り早くインストールを行う。
root権限で。

# yum --enablerepo=remi install php-pear
# yum --enablerepo=remi install php-devel
# wget http://www.libssh2.org/download/libssh2-1.2.tar.gz
# tar xvfz libssh2-1.2.tar.gz
# cd libssh2-1.2
# ./configure && make && make install

上二行はインストールに必要なパッケージを先回りしてインストールしておく。
3行目:ssh2のパッケージをDLして解凍&インストール。この辺はサクサクと。

# pecl install ssh2-beta

で、インストールするわけだが、

/var/tmp/ssh2-0.11.0/ssh2.c -o ssh2.o
/var/tmp/ssh2-0.11.0/ssh2.c:52: error: duplicate 'static'
/var/tmp/ssh2-0.11.0/ssh2.c: In function 'zif_ssh2_methods_negotiated':

ぬぬん?コンパイルエラー・・どうしたものか。。
とりあえずソースをDLしてやってみよう。

# wget http://pecl.php.net/get/ssh2-0.11.0.tgz
# tar zxvf ssh2-0.11.0.tgz
# cd ssh2-0.11.0
# phpize
# make

おりゃ、と

/var/tmp/ssh2-0.11.0/ssh2.c -o ssh2.o
/var/tmp/ssh2-0.11.0/ssh2.c:52: error: duplicate 'static'
/var/tmp/ssh2-0.11.0/ssh2.c: In function 'zif_ssh2_methods_negotiated':

だめぽ。

google先生にお伺いを立てると、どうもパッチがあるらしい。
DLしてインストール。

# wget http://remi.fedorapeople.org/ssh2-php53.patch
# patch <  ssh2-php53.patch
# ./configure && make && make install

でおk。後は

# vi /etc/php.d/ssh2.ini
extension=ssh2.so 
# /etc/rc.d/init.d/httpd restart

でモジュールを読み込ませて終わり。

追記:実はまだ動いてない
追記2:2009/10/19 もう一回インストールしたら動いた。謎。

【ただの技術日記】Zend Framework をやってみて

バージョンが1.8に上がって、やたらFWっぽくなってきた気がする。
zf.shによる自動生成機能、Dojoツールキット、Zend_Form当たりの使いこなしがこれからの鍵を握る気がする。
まぁ、詳しくは後程。(こればかりがたまりそう・・・)

【ただの技術備忘録】g++がインストールできない!?

swfmillをインストールしようとして出てきたエラー

checking for C++ compiler default output file name...
configure: error: C++ compiler cannot create executables

無論のことながらgccはインストールしている、はずであった。
結論から言えば、

yum -y install gcc

では、g++はインストールされないようだ。正しくインストールするには

yum -y install gcc gcc-g++

と入力すればよかったらしい。前は出来たと思ったんだけどなぁ。。。