selectについて調べてみた

Pocket

***本記事にはプロモーションが含まれています。***

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

Pocket