UNIX上でのC言語による、TCP/IPソケットを使った"echo"サーバ/クライアントのサンプル実装をcodereposに登録しました。
http://coderepos.org/share/browser/lang/c/echo_samples
2013-07-28 : msakamoto-sfが著作権を持っているコードのみ、GitHubにコピーしました。以降はこちらを更新します。
https://github.com/msakamoto-sf/toybox/tree/master/tcp_echo_sample/c
詳細はREADME_ja.txtを参照して下さい。
http://coderepos.org/share/browser/lang/c/echo_samples/README_ja.txt
元々、「サーバ側でどうにかして"接続タイムアウト"をクライアント側に発生させられないかな」と思い、select + acceptの間にsleepかませたらどうかとか考えていたのですが、下記リンクの「TCP/IP エラー処理 connect編」で普通に「マシンが居ないIPアドレスに接続」で普通にクライアント側で発生させることが出来たので、そこまでは作りませんでした。
というか、最後にソケット系の関数を弄くったのが1年以上昔で、思い出して普通のブロッキングバージョンのechoサーバ/クライアント作るだけで土日終わってしまいました・・・。
ギリギリで、connect()前にソケットを非ブロッキングモードにしておき、EINPROGRESSで戻ったらタイムアウト秒数指定のselect()で任意のタイムアウト秒数を設定できるサンプルが出来ました。
そもそもSYN+ACKを返したりするのはOSのTCPスタック内部の処理なので、ユーザーランドからはそこまで制御できないのでは?と思ったり・・・。SOCK_RAW使ったら出来るかな?
また来週末位に、気力が残っていたらサーバ側で select() + accept() するパターンを実験してみようと思います。
以下は参考にしたリンクです。
コメント