Winsock2のによるサーバサイドプログラムにおける繰り返し処理

[戻る]
Alq3 2010/08/15(日) 22:50:44
Vista SP2+VC++2005(MFC:ダイアログベース)で開発をしております。
http://msdn.microsoft.com/en-us/library/ms738545
および
http://msdn.microsoft.com/en-us/library/ms737593(v=VS.85).aspx
を参考にしてTCP通信のプログラムを作成しております。

後者のコードにおいては、一度受信をするとその時点でプログラムが終了してしまいま
すが、
作成するプログラムにおいては受信部分をループして何度でも「接続」を受け付けたい
と考えています。
しかしこの『接続』と言うものに関して理解が不足しておりまして、
(特にbind/listen/acceptの違いがイマイチ…)
コードのどこからどこまでをループするべきなのかがわかりません。

どこからどこまでをループ処理することによって繰り返し受信することが可能であるの
か
お分かりになる方がいらっしゃったら、ご教授いただければ幸いです。
よろしくお願いいたします。

aetos 2010/08/16(月) 00:51:59
bind というのはサーバ側で待ち受ける IP アドレスを決める処理です。
listen というのは待ち受けを開始する処理です。
accept というのはクライアントからの接続を受け入れ、コネクションを1つ作成する処
理です。

…どこを繰り返せばいいかわかりますか?

Alq3 2010/08/16(月) 01:48:07
>aetos氏
回答ありがとうございます。
accept()〜shutdown()でしょうか?
どちらかというと終わりの方が自信がありません。

自分の中でも疑問点がモヤモヤしているのですが、無理やり言葉にすると、
(1)closesocket()という関数名が示しているようにソケットを『閉じる』操作があるの
に対し、どの時点でソケットが『開く』のかが分からない。
(2)双方のやり取りが始まるのはaccept()からであるが、やり取りが終わるのがどの時点
かわからない(そもそも明示的にやり取りを終了しないといけないのか?)。

という2点になるかと思います。

aetos 2010/08/16(月) 11:19:43
> accept()〜shutdown()でしょうか?

closesocket まででしょうね。

> (1)closesocket()という関数名が示しているようにソケットを『閉じる』操作が
> あるのに対し、どの時点でソケットが『開く』のかが分からない。

closesocket は SOCKET を後始末する関数です(大文字小文字に注意。ここで言う 
SOCKET は closesocket の引数になっているあれを指します)。
であれば、その SOCKET が最初に現れる個所が「開く」タイミングと思ってよいでしょ
う。

> (2)双方のやり取りが始まるのはaccept()からであるが、やり取りが終わるのが
> どの時点かわからない(そもそも明示的にやり取りを終了しないといけないのか?)。

明示的に終了する必要があります。
どのタイミングですべきかと言えば、それは作っているアプリや使っているプロトコル
によるので一概には言えない、ということになります。

例えば HTTP ですと、クライアントがサーバにリクエストを投げて、サーバから取得す
べきデータが全部取得されたらコネクションは切れます。ここが HTTP における終了の
タイミングです。
別のリソースを取得するときには新たにコネクションを張りなおします。
しかし、プロトコルによっては、1つの接続をずーっと使いまわしていくつものデータ
を転送する場合があるかもしれません。

このサイトが参考になるでしょうか。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

tetrapod 2010/08/16(月) 11:56:40
accept で待ちうけしている socket と
実際にデータのやり取りをする socket とは違う
というあたりを理解しているか否か、かなぁ

接続待ち(は、データの受け渡しを担当しない)
socket = 接続ソケット作成
bind = (複数の IP アドレスを持つ機器では、どの IP addr 上で) 接続待ち指定
listen = 接続待ち準備完了
一般的には accept を繰り返す = 接続されると新しい SOCKET が生成される

データのやり取りは accept が作った新しい SOCKET 上にて行われる
read/write = データ送受信
close(socket) = 切断(やり取り中のデータは破棄される)

http://www.geocities.co.jp/Athlete-Samos/7760/study/unix_socket1.html

Alq3 2010/08/16(月) 15:25:25
[[解決]]
tetrapod氏の
>実際にデータのやり取りをする socket とは違う
という指摘を受けてようやく腑に落ちました。
テストプログラムでも正常に動くことを確認いたしましたので解決とさせていただきま
す。

aetos氏、tetrapod氏、本当にありがとうございました。
提示された参考URLをもとにプログラムのブラッシュアップを図らせていただきます。

古いスレッドには追加発言できません。