• ベストアンサー

winsockを使った通信での同時接続について

WSAAsyncSelectを使ってソケットにくるネットワークイベントを受け取って処理しようとしています。 サーバーに複数のクライアントが接続してくる通信プログラムを作っています。 クライアントがバラバラのタイミングで接続してくると問題なく通信が行えるのですが 同時に接続してくると通信がうまく行えなくなってしまいます。 サーバー側で接続してくるクライアント分だけソケット作る必要がありますか? lまた、listen関数を使って無いのですが使う必要はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>サーバー側で接続してくるクライアント分だけソケット作る必要がありますか? lまた、listen関数を使って無いのですが使う必要はありますか? サーバソフトは、複数を同時に対応できるように作成します。なので、listen関数を使わないというのは、ありえません。

who_ray_sis
質問者

お礼

ありがとうございます。自分の見たサンプルプログラム になかったのでいらないものと思っていました。

その他の回答 (1)

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.2

WinSock2.0プログラミングの373ページ それから、 10,11,12章 が参考になるかもしれません。 ソフトバンクパブリッシング 発行

who_ray_sis
質問者

お礼

参考文献の紹介ありがとうございます。 必ず後で探して読んでみたいと思います。 http://dixq.net/forum/viewtopic.php?f=3&t=13815 ここでも似たような質問をさせてもらったのでよかったらご回答お願いします。

関連するQ&A

  • ソケット通信におけるデータ送信手法

    ソケット通信ができるサーバプログラムをPHPにて組んでいますが、疑問があります。 Server/Clientの形で、PHPでくんだServer側はListenして通信を待っているのですが、仮に、サーバ側から任意のタイミングで通信を発生させることは可能なのでしょうか。 これが1点です。 あと、1つのサーバプログラムに対して、複数のクライアントが接続するようなパターンは作成可能なのでしょうか。 暗中模索のため、難儀しています。 ご教示いただければ幸いです。

    • ベストアンサー
    • PHP
  • winsockを使った通信方法

    winsockを使った通信でサーバークライアント方式の通信プログラムで クライアントプログラムがサーバープログラムに接続して、 クライアントプログラムで移動あった時のみ サーバーに現在の位置情報を送信し、サーバープログラムが他の参加者に 送信するという通信方式で通信を行っています。 この方法だと接続者が複数人の場合、一人だけ移動していると普通に通信でき位置情報の更新 も出来るのですが、 同時に移動が起こると、モデルが勝手に移動してクライアントプログラムに触れなくなってしまいます。 これを避けるにはどうしたらいいでしょうか?

  • UDP通信での受信方法について

    MFCでUDPプロトコルを使ったサーバー・クライアントをソケットプログラムで書いております。 ソフトの内容は、クライアントから送信されたの文字列のコマンドをサーバで処理をするだけです。 サーバー側での受信の仕方は WSAAsyncSelect()関数を使ってソケットイベントが発生するごとに親ウィンドウに自作のメッセージ(WM_MY_MSG)が送られるように設定する ↓ WM_MY_MSGのメッセージハンドラ内でrecvfrom()関数を使って受信する。 という方法を用いています。クライアント2台ぐらいであれば正常に動きます。 質問1: まだ試したことはないのですが(というより試す環境がない)、ほぼ同時ぐらいに複数(10台ぐらい)のクライアントからコマンドが送信された場合、それを全部正確に受信できるものなのでしょうか?要するに一つのコマンドを処理中に別のコマンドが送られてきた場合の動作はどうなるのでしょうか? 質問2: UDP通信での受信をする場合の何かもっとスタンダードな方法があるのでしょうか? よろしくお願いします。

  • Winsockプログラミング Connectのエラーについて

    お世話になっております。 現在、Windowsソケットプログラム(winsock1.1)により、P2Pでの非同期のTCP通信プログラムを組んでます。 そこで、クライアントからサーバーへの同時接続のチェックをするために以下のような処理を行っています。 #関係ありそうな情報のみ載せます。足りなければご質問下さい。 OSはWindowsXP HomeEditionです。 なお、OSによる同時接続制限はBiotというツールにより20000というふうに設定しております。 ・クライアント 1.ソケット3000個用意 2.for文ループ処理によりソケット数分Connectを実行 ・サーバー 1.listenの同時接続最大数は20000に設定 毎回Connect実行時、大体2000回目辺りからエラーが出てきます。 その後、イベントが返って来た時のエラーチェックでも、WSAECONNREFUSED(10061)で「サーバーにより接続が拒否された。」というエラーが検出されます。 結局、接続成功は500~700回ぐらいでした。 この現象に対する対処法や解決法はないでしょうか? 現状では、全てのConnect要求を成功できるようにしたいと思っております。 子プロセスを作成するような方法は時間が無いので考えておりません。 9/18にも同じようなしておりますが、前より詳細を書いて再投稿いたしました。 以上、よろしくお願い致します。

  • TCP/IP通信OCXのアウトラインを教えてください)

    Cの知識はありますが、 Windows開発は今回がはじめてです。 VC++6.0でTPC/IP通信を行うOCXを作成し、 クライアント(VB6.0で作成)から呼び出そうとしています。 TCP/IP通信のc/sサンプルプログラムはいくつかみましたが、 その機能をOCXの形にしたいときどう考えたらよいか アウトラインを教えていただけないでしょうか? わたしなりには以下のように考えました。 通信用のクラスを作成し、 メンバ変数(private)として ・サーバIP ・ポート番号 ・ソケットハンドル などを用意。 メッソッドとして ・接続(ソケット初期化~接続まで) ・送受信(ループ処理?) ・切断(シャットダウン~クリーンアップまで) イベントとして ・??? イベントとメソッドに何を用意すべきか (呼ぶべき関数と手順はわかるのですが、 メソッドとすべき単位がわかりません)と OCXから非同期モード設定関数(WSAAsyncSelect()) をよぶときの第2パラメタ(HWND)に 何をセットすべきかがわかりません。

  • ソケット通信で同時受信の制限?

    こんにちは。 早速ですが、ソケット通信について質問です。 複数クライアント(Win)からサーバ(UNIX)に対して、connect()し、サーバ側はaccept()したら、それぞれに対しfork()で子プロセスを作っています。 そこで、50台くらいのクライアントから一気にconnect()すると通信エラーとなってしまうのですが、なにか制限があるのでしょうか? connect()のタイミングをずらせば、それぞれのクライアントとサーバの子プロセスでやり取りができます。 一斉にconnect()される場合の通信エラーの原因や対処法などをご教授願います。 初歩的なことかもしれませんが・・・。 よろしくお願いいたします。

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • vb2010でソケット通信を使いたいのですが

    はじめまして。 vb2010でソケット通信を使いたくて、今TCPサーバーを作っています。 クライアント側から受信した瞬間にサーバー側から返信というのは可能でしょうか。 受信したタイミングで接続が切れてしまって困っています。 初めてソケット通信に触れてイマイチ分かってないので説明がうまくいきませんが、 どなたかわかる方がいらっしゃいましたらご回答よろしくお願いします。

  • ソケット通信で、250本しか接続できない

    solaris上で、ソケット通信をするプログラムを作成しております。 サーバー側にクライアントを多数接続したいのですが、 250本くらい接続するとサーバー側でacceptを呼び出したタイミングで セグメント例外を出力して異常終了してしまいます。 ここからは推測なのですが、 サーバー側のディスクリプタが255までは正常に動作するため、 ディスクリプタの数が256に制限されているのではないかと思います。 そこで、ulimitでdescriptorsを増やしたり、 setrlimit関数で、RLIMIT_NOFILE値を増やしたりしてみましたが、 状況は全く変わりませんでした。 念のためスタックサイズを増やしてもみましたがやはり効果ありませんでした。 どなたか、解決方法をご存じでしたら、ご教授頂けませんか? よろしくお願いします。

  • ソケット通信異常

    クライアントがソケットを接続した状態でサーバープロセスがいきなりDownした場合、クライアント側でlisten()から抜けてきません。 OSのパッチ等あるのでしょうか?