• ベストアンサー

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

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

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

  • ベストアンサー
回答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