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() するパターンを実験してみようと思います。 以下は参考にしたリンクです。 - "TCP/IP Protocol Sequence Diagrams" -- http://www.eventhelix.com/RealtimeMantra/Networking/ -- TCP/IP関連プロトコルの各種シーケンスダイアグラム。 ''お役立ち度最高レベル保証'' - RFC793 -- http://www.rfc-editor.org/rfc/rfc793.txt -- "3.2. Terminology"の末尾、Page 23にTCPコネクションの状態遷移図がある。これが基本になる。 - "TCP tutorial" -- http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html -- TCPの簡単なまとめメモ。 - "TCP/IP エラー処理 connect 編" -- http://x68000.q-e-d.net/~68user/net/tcp-connect-1.html -- connect()で発生するエラーパターンとその原因などが丁寧にまとめられている。ここに普通に接続タイムアウトが発生する条件が載っていた。 - "6.11 Connect with timeout (or another use for select() ) - UNIX Socket FAQ" -- http://www.developerweb.net/forum/showthread.php?p=13486 -- クライアント側で任意の秒数で接続タイムアウトを検出する基本原理。サンプルコード付。参考にしました。 - "selectシステムコールを使ったTCPサーバ" -- http://asistobe851.hp.infoseek.co.jp/my-memo/select.html -- selectを使ったechoサーバの実装例 - "Know your TCP system call sequences" -- http://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/index.html -- AIX におけるTCP関連システムコールの内部挙動の解説。図入りで詳しい。 - "Socket間通信 echoサーバを作る | イイ!! プログラミング Blog" -- http://blog.majide.com/2009/02/socket-programming-server/ -- シンプルなブロッキングモードのechoサーバ