***本記事にはプロモーションが含まれています。***
selectについてのメモ。
走り書きなので自分しかわからないかも。
サーバーではacceptで待つ。接続がくると新しいソケットが作られる。そのソケットに書き込んだり読んだりすることでデータがやりとりされる。
selectを使う順番は、
socket
bind
listen
select <--ここ
accept
recv/send ということらしい。
non-blockingの設定は、listenしているソケットに対して行っている。
acceptしてできるソケットはnon-blockingにしなくていいのか?
そのソケットもnon-blockingにしないといけない。
FD_SET(STDIN, &readfds)とやるとキーのリターンに反応する。
STDIN=0。Linuxのときのみ。
non-blockingとselectは、直接の関係はない。blockingのソケットも、selectできるみたい。
blockingでacceptすると止まってしまうから、non-blockingにするかselectを使うかみたいなことが書いてある。
データがくるたびにacceptしていたらソケットが増えてしまうけど?
listenしているfdにselectが反応するときだけ、acceptしてソケットを作る。そのソケットをFD_SETしてまたselect。接続が切れたら、FD_CLR。
TCPの場合は、listenしているソケットに対するselectも可能だって。UDPの場合はだめってこと?
UDPは、listenせずにbindしたポートでそのままデータをrecvしている。TCPは、1対1の通信しかできない。接続を確立したらデータは保障される。
UDPで双方向通信をやろうとしたらclinet/serverのどちらも待ち受けポートを作らないといけないってこと?
必要ないみたい。UDPのポートにclientからconnectすることは可能。そのときは、sendtoではなく、sendを使う。serverからsendできなかった。serverでは、sendtoとrecvfromをつかう。
UDPは、マルチキャストに使うべき。そんなことするなって。
Winsock特有かもしれないところ。
clientを止めると、recvが0で返るときと<0で返るときがあるみたい?<0のときのWSAGetLastError()=WSAECONNREST。UNIXでは、recvは0で返るみたい。
コネクションが2つ以上あると、1つクライアントを止めるとrecvは<0で返る。bloking/non-blockingは関係ないみたい。
sendで変なデータを送信しようとしたら、WSAENOTSOCKというエラーが出て、以降の操作がエラーになった。クライアント側には何も出力されない。
参考にしたところ。
ファイヤープロジェクト
http://www.h7.dion.ne.jp/~matsu/feature/c-language/socket/select.html
SOCKETプログラミング
http://www.ops.dti.ne.jp/~allergy/socket/socket.html
socketプログラミングメモ
http://www.aihara.co.jp/~junt/program/socket.html
Programming UNIX Sockets in C - Frequently Asked Questions
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
Winsock Programmer's FAQ
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
winsockプログラミング
http://www.geekpage.jp/programming/winsock/
英語のサイトもいろいろあるみたいだけど。
Beej's Guide to Network Programming Using Internet Sockets
http://beej.us/guide/bgnet/output/htmlsingle/bgnet.html
Socket Server in Win32 Select Model
http://www.codersource.net/winsock_tutorial_server_select_model.html