- ベストアンサー
Connectエラーが出てしまう・・・。
VC++でストリーム型のネットワークアプリケーションを作成しています。 サーバソケット、クライアントソケットを作成し、Connectしようとしているのですが、WSAEWOULDBLOCKエラーが出てきてしまいます。 いったい何が原因なのでしょう・・・。 調べているのですが手がかりがつかめません。 なにか心あたりのある方、教えてください。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>OnAccept()はすぐ帰ってくるのですが、、、 んー。サーバー側の動きですが Listen() -> OnAccept() -> Accept() となりますが Accept()する時 new した新しい CAsyncSocket に割り当ててますよね? Listenするソケットと実際に通信するソケットは異なるのが普通です。 情報が少ないので、ちょっとよく分かりません。
その他の回答 (4)
- SpiralGalaxy
- ベストアンサー率39% (649/1653)
>同じマシン上でも理論上は可能ですよね?? 理論上というか、全然問題ないです。 >しかし、なかなかOnConnect()に帰ってこないのですよね。。 ん?同じマシンですよね? 一瞬のうちにつながりませんか? なかなか返ってこないというのは、返ってくるけど遅いということですか?
お礼
大変ありがとうございました。 エラーコード拾えました;;;;;; すいません。 本当にお世話になりました。
補足
解答ありがとございます。 助かっています。 すぐ返ってこないというのは、何か致命的なエラーがあるのでしょうか・・・・。 OnAccept()はすぐ帰ってくるのですが、、、 流れとしては、現在クライアントがConnectしたら、サーバがOnAccept→Accept 、そこで動きは止まってしまいます。 もしかしたら非同期式になっていないのでしょうか・・・・。 なんだか不安なのですが。 スイマセン、ご面倒お掛けしています・・。
- zerosix
- ベストアンサー率31% (47/149)
非ブロッキングモードなら、デフォルトで WSAEWOULDBLOCK が返ってきますので、エラーと判断することはないですよ。 正常動作です。 つまり、getLastErrorを実行しても、 WSAEWOULDBLOCK以外が返ってきた場合を エラーとしてあげて、 WSAEWOULDBLOCKが戻った場合は、以降の処理をして構いません。
お礼
ありがとうございました。 繋がりました。。。
- SpiralGalaxy
- ベストアンサー率39% (649/1653)
MFCだったらおそらく CAsyncSocket で接続されているのだと思いますが、非ブロッキングソケットの場合は Connect を呼び出してもその時点では接続しない(接続するまで関数がブロックしない)のでこのWSAEWOULDBLOCKが返ってきます。 この場合WSAEWOULDBLOCKが返るのは正常な動作です。このエラーコードだけは無視すればいいです。そのうち接続結果が OnConnect() に返ってきますのでそこで接続結果を判断しましょう。 昔悩んだ記憶があります。(^^;
補足
ありがとうございます。 しかし、なかなかOnConnect()に帰ってこないのですよね。。 同じマシン上でも理論上は可能ですよね??
- zerosix
- ベストアンサー率31% (47/149)
非ブロッキングモードとブロッキングモードのどちらでソケット処理を しているのでしょうか? 非ブロッキングモードでソケットを生成している場合、 必ずこの値が戻るようです。 非ブロッキングモードの場合は、接続完了イベントがコールバックされた以降に 送受信処理をすればできると思います。 ブロッキングモードは特定の理由がない限り、処理がとまってしまうので 使用しないほうがいいかと思います。→これはうそかも。 ちなみに私が以前作成したときは、非ブロッキングモードで送受信処理を おこないました。
- 参考URL:
- http://www.microsoft.com/japan/developer/library/vccore/_core_windows_sockets.3a_.blocking.htm
補足
すばやい解答ありがとうございます。 非ブロッキングモードでソケット処理を行っています。 すいません、接続完了イベントはOnConnectを使うのでしょうか??? 知識が危ういもので。。。 接続が完了していなくてもサーバのAccept、クライアントのSendはエラーが起きていないのです。 ただ、サーバのReceiveで接続されていないというエラーが出てくるのです。 なにかご存知でしたら教えてください。
お礼
いろいろご教授ありがとうございました。 接続できるようになりました・・・。 しかし、相手が受信したことを確認できるアプリケーションにはまだ遠いようです。 STREAM型を使えばできると思っていたのですが・・・。 何かほかにご存知でしたら知らせてください。 本当にどうもありがとうございました。
補足
ありがとうございます。 >Listenするソケットと実際に通信するソケットは異なるのが普通です。 ここに気付いていませんでした・・。 うまく状況を説明できて居らず、スイマセン。 STREAM型(TCP/IP接続で)のネットワークアプリケーションを作りたいのです。 もう一度、教えていただいた方法で試してみます。