プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (5件)

非ブロッキングモードとブロッキングモードのどちらでソケット処理を


しているのでしょうか?

非ブロッキングモードでソケットを生成している場合、
必ずこの値が戻るようです。

非ブロッキングモードの場合は、接続完了イベントがコールバックされた以降に
送受信処理をすればできると思います。

ブロッキングモードは特定の理由がない限り、処理がとまってしまうので
使用しないほうがいいかと思います。→これはうそかも。

ちなみに私が以前作成したときは、非ブロッキングモードで送受信処理を
おこないました。

参考URL:http://www.microsoft.com/japan/developer/library …

この回答への補足

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

補足日時:2001/10/30 11:11
    • good
    • 0

MFCだったらおそらく CAsyncSocket で接続されているのだと思いますが、非ブロッキングソケットの場合は Connect を呼び出してもその時点では接続しない(接続するまで関数がブロックしない)のでこのWSAEWOULDBLOCKが返ってきます。



この場合WSAEWOULDBLOCKが返るのは正常な動作です。このエラーコードだけは無視すればいいです。そのうち接続結果が OnConnect() に返ってきますのでそこで接続結果を判断しましょう。

昔悩んだ記憶があります。(^^;

この回答への補足

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

補足日時:2001/10/30 18:42
    • good
    • 0

非ブロッキングモードなら、デフォルトで


WSAEWOULDBLOCK
が返ってきますので、エラーと判断することはないですよ。
正常動作です。

つまり、getLastErrorを実行しても、
WSAEWOULDBLOCK以外が返ってきた場合を
エラーとしてあげて、
WSAEWOULDBLOCKが戻った場合は、以降の処理をして構いません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/31 15:37

>同じマシン上でも理論上は可能ですよね??



理論上というか、全然問題ないです。

>しかし、なかなかOnConnect()に帰ってこないのですよね。。

ん?同じマシンですよね?
一瞬のうちにつながりませんか?
なかなか返ってこないというのは、返ってくるけど遅いということですか?

この回答への補足

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

スイマセン、ご面倒お掛けしています・・。

補足日時:2001/10/30 21:18
    • good
    • 0
この回答へのお礼

大変ありがとうございました。
エラーコード拾えました;;;;;;

すいません。
本当にお世話になりました。

お礼日時:2001/10/31 15:34

>OnAccept()はすぐ帰ってくるのですが、、、



んー。サーバー側の動きですが
Listen() -> OnAccept() -> Accept() となりますが
Accept()する時 new した新しい CAsyncSocket に割り当ててますよね? Listenするソケットと実際に通信するソケットは異なるのが普通です。

情報が少ないので、ちょっとよく分かりません。

この回答への補足

ありがとうございます。

>Listenするソケットと実際に通信するソケットは異なるのが普通です。
ここに気付いていませんでした・・。

うまく状況を説明できて居らず、スイマセン。
STREAM型(TCP/IP接続で)のネットワークアプリケーションを作りたいのです。
もう一度、教えていただいた方法で試してみます。

補足日時:2001/10/30 23:36
    • good
    • 0
この回答へのお礼

いろいろご教授ありがとうございました。
接続できるようになりました・・・。

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

本当にどうもありがとうございました。

お礼日時:2001/10/31 15:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!