• ベストアンサー

Connectエラーが出てしまう・・・。

VC++でストリーム型のネットワークアプリケーションを作成しています。 サーバソケット、クライアントソケットを作成し、Connectしようとしているのですが、WSAEWOULDBLOCKエラーが出てきてしまいます。 いったい何が原因なのでしょう・・・。 調べているのですが手がかりがつかめません。 なにか心あたりのある方、教えてください。 よろしくお願いします。

  • dole
  • お礼率35% (12/34)

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

  • ベストアンサー
回答No.5

>OnAccept()はすぐ帰ってくるのですが、、、 んー。サーバー側の動きですが Listen() -> OnAccept() -> Accept() となりますが Accept()する時 new した新しい CAsyncSocket に割り当ててますよね? Listenするソケットと実際に通信するソケットは異なるのが普通です。 情報が少ないので、ちょっとよく分かりません。

dole
質問者

お礼

いろいろご教授ありがとうございました。 接続できるようになりました・・・。 しかし、相手が受信したことを確認できるアプリケーションにはまだ遠いようです。 STREAM型を使えばできると思っていたのですが・・・。 何かほかにご存知でしたら知らせてください。 本当にどうもありがとうございました。

dole
質問者

補足

ありがとうございます。 >Listenするソケットと実際に通信するソケットは異なるのが普通です。 ここに気付いていませんでした・・。 うまく状況を説明できて居らず、スイマセン。 STREAM型(TCP/IP接続で)のネットワークアプリケーションを作りたいのです。 もう一度、教えていただいた方法で試してみます。

その他の回答 (4)

回答No.4

>同じマシン上でも理論上は可能ですよね?? 理論上というか、全然問題ないです。 >しかし、なかなかOnConnect()に帰ってこないのですよね。。 ん?同じマシンですよね? 一瞬のうちにつながりませんか? なかなか返ってこないというのは、返ってくるけど遅いということですか?

dole
質問者

お礼

大変ありがとうございました。 エラーコード拾えました;;;;;; すいません。 本当にお世話になりました。

dole
質問者

補足

解答ありがとございます。 助かっています。 すぐ返ってこないというのは、何か致命的なエラーがあるのでしょうか・・・・。 OnAccept()はすぐ帰ってくるのですが、、、 流れとしては、現在クライアントがConnectしたら、サーバがOnAccept→Accept 、そこで動きは止まってしまいます。 もしかしたら非同期式になっていないのでしょうか・・・・。 なんだか不安なのですが。 スイマセン、ご面倒お掛けしています・・。

  • zerosix
  • ベストアンサー率31% (47/149)
回答No.3

非ブロッキングモードなら、デフォルトで WSAEWOULDBLOCK が返ってきますので、エラーと判断することはないですよ。 正常動作です。 つまり、getLastErrorを実行しても、 WSAEWOULDBLOCK以外が返ってきた場合を エラーとしてあげて、 WSAEWOULDBLOCKが戻った場合は、以降の処理をして構いません。

dole
質問者

お礼

ありがとうございました。 繋がりました。。。

回答No.2

MFCだったらおそらく CAsyncSocket で接続されているのだと思いますが、非ブロッキングソケットの場合は Connect を呼び出してもその時点では接続しない(接続するまで関数がブロックしない)のでこのWSAEWOULDBLOCKが返ってきます。 この場合WSAEWOULDBLOCKが返るのは正常な動作です。このエラーコードだけは無視すればいいです。そのうち接続結果が OnConnect() に返ってきますのでそこで接続結果を判断しましょう。 昔悩んだ記憶があります。(^^;

dole
質問者

補足

ありがとうございます。 しかし、なかなかOnConnect()に帰ってこないのですよね。。 同じマシン上でも理論上は可能ですよね??

  • zerosix
  • ベストアンサー率31% (47/149)
回答No.1

非ブロッキングモードとブロッキングモードのどちらでソケット処理を しているのでしょうか? 非ブロッキングモードでソケットを生成している場合、 必ずこの値が戻るようです。 非ブロッキングモードの場合は、接続完了イベントがコールバックされた以降に 送受信処理をすればできると思います。 ブロッキングモードは特定の理由がない限り、処理がとまってしまうので 使用しないほうがいいかと思います。→これはうそかも。 ちなみに私が以前作成したときは、非ブロッキングモードで送受信処理を おこないました。

参考URL:
http://www.microsoft.com/japan/developer/library/vccore/_core_windows_sockets.3a_.blocking.htm
dole
質問者

補足

すばやい解答ありがとうございます。 非ブロッキングモードでソケット処理を行っています。 すいません、接続完了イベントはOnConnectを使うのでしょうか??? 知識が危ういもので。。。 接続が完了していなくてもサーバのAccept、クライアントのSendはエラーが起きていないのです。 ただ、サーバのReceiveで接続されていないというエラーが出てくるのです。 なにかご存知でしたら教えてください。

関連するQ&A

  • 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にも同じようなしておりますが、前より詳細を書いて再投稿いたしました。 以上、よろしくお願い致します。

  • WinsockでConnect元を判断したい

    大変困っています。何か知恵を授けてください。 VC++.Net2005でソケット通信のサーバアプリを書いています。 ・サーバアプリのListenPortは1つです。 ・クライアントAからアプリA1、アプリA2がConnectしてきます。 ・アプリA1、アプリA2の起動順は不確定です。 上記の条件で、どちらのアプリからのConnect要求かを判断したいのですが 何か方法は無いでしょうか?

  • ソケットインタフェースに関して

    クライアント/サーバ間でTCP/IPソケットのプロトコルを使用してネットワークを構築しようとしています。 TCP/IPソケットで、最初のクライアントAからconnectされた状態でクライアントBから同一ポートにconnectされた場合、クライアントBからのconnectを有効にしたいと考えています。本場合、他のクライアントからconnectされたことがTCP/IP層で検知可能でしょうか?また、アプリケーション層での作りは、どのようにすればよいか知っている方教えて下さい。

  • Android Socket.connectエラー

    Androidでソケット通信するプログラムを作っています。 PC側がソケットサーバーをたてて(accept)、 Android側でクライアントとして接続(connect)するようにしています。 connectを実行している部分のソースは以下のようにしています。 ----------------- String ip = "192.168.XX.XX"; <-PCのIPアドレス int port = 9999; socket = new Socket(); InetSocketAddress addr = new InetSocketAddress(ip, port); try{ socket.connect(addr); return true; }catch(IOException e){ e.printStackTrace(); return false; } ------------------ 上記やり方でまずはエミュレータで試したところうまく行きました、その後 実機に入れて同じように実行したところconnectのところで例外が飛んできます。 メッセージは"no route to host"でした。 実は全く同じソースで以前は実機でもできていたはずなんですが、 最近試したところできなくなっているようでした。 Android端末はXperia Arcですが、OSを2.3.4にバージョンアップしたことくらいで 以前と特に変わったところはないと思うのですが 原因として何が考えられるでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • ソケット通信で同時受信の制限?

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

  • z-connectについて教えてください

    インターネット中に接続が切断されるトラブルが続いています。切断後、必ずネットワーク接続のところにz-connectという別の接続が作成されるのでおそらくこれが原因ではないかと思われます。 削除しても復活してくるのですがどうしたらよいでしょうか?

  • ネットワークアドレスが無効というエラー

    HolLineというアプリケーションを使っています。Server/Clientタイプのアプリケーションで、こちらはクライアントです。バージョンは1.7.2.1です。 今まで普通につながっていたのに、ある日突然接続しようとすると「ネットワークアドレスが無効です」というエラーがでて、つながりません。 エラー前後で特に何かをインストールしたり削除した覚えはありません。 ネットワークアドレスとは何でしょうか?無効/有効の切り替えはどこでできるのでしょうか? サーバー側が悪いのかもしれないのですが、こちらが悪いかもしれません。 OS9.2.1 G4350MHzを使っています。局所的な質問で恐縮ですがよろしくお願いします。

    • ベストアンサー
    • Mac
  • java socketエラーについて

    javaでソケット接続するプログラムを作成しています。ソケット接続の以下のエラーがたまに発生するのですが、このエラーが出た際、回避方法がわかりません。どのようにしたら再度ソケット接続を行なえるのでしょうか? 以下エラー内容です。 java.net.ConnectException: failed to connect to /192.168.10.12 (port 50000): connect failed: ENOBUFS (No buffer space available) お詳しい方、よろしくお願いします!

    • ベストアンサー
    • Java
  • ネットワーク上のサーバーの空き容量取得

    VC++を使用して、ネットワーク上のサーバ(Linax)へFTPでファイルを転送するアプリケーションを作成しているのですが、転送する時にサーバの空き容量を取得し、表示したいのですが、実現できず困っております。 どうかご教示お願いいたします。 クライアントPC環境:WinXp Pro

  • VC++でのTCP/IP接続プログラム

    こんにちは。 VC++で開発を行っています。 TCP/IP接続(ストリーム型)のプログラムがうまく書けません。 UDP/IP接続は出来たのですが・・・。 TCP/IP接続で、送受信可能なプログラムを作りたいと思っています。 一つのアプリケーションで、サーバーとクライアントの役割を持たせたいのですが・・・。 不可能でしょうか?? VC++でTCP/IPを利用したプログラムのサンプルでも構いません。 なにか情報をお持ちの方、教えてください。 よろしくお願いします。