質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

5572閲覧

CASyncSocketでConnectを実行したら返り値として1を取得したい

notgoodpg

総合スコア37

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/02/28 06:08

編集2018/02/28 07:19

前提・実現したいこと

CASyncSocketでデバイスとやり取りをするために、サンプルコードに倣って接続を行う関数を作成しました。
ですがCASyncSocket::Connect関数の返り値は0(==FALSE)でWSAGetLastErrorでエラーコードを取得すると10035が得られました。
この動作自体は当然らしいのですが、すでにあるサンプルコードではConnectの返り値が1です。
サンプルコード通りに接続を完了させるために何が不足なのか分かりません。

なおサンプルは諸事情で貼り付けられません。
具体性を欠く質問になってしまい申しわけありませんがお知恵を貸していただければ幸いです。
よろしくお願いいたします。

(追記依頼を受けて、出来るだけ追記)
ちなみに、サンプルではCASyncSocketを継承したクラスで接続を行っています。
といってもConnectなどのオーバーライドはせずOnConnectなどのイベント時の動作のみオーバーライドしています。
よって、該当のソースコードではCASyncSocketの関数が直接呼ばれています。

該当のソースコード

c++

1void CSerialDlg::OnButton1(){ 2 int nRet; 3 CAsyncSocket sc; 4 // シリアル通信 5 // なぜかうまくいくコード 6 //nRet = sc.Create(); 7 //nRet = sc.AsyncSelect(FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE); 8 //nRet = sc.Connect(_T("192.168.1.10"), 9000); // やってる事は同じはずなのにCAsyncSocketクラスそのままだとnRet==0になる 9 //if( nRet){ 10 // return; 11 //} 12 //else { 13 // int hoge = WSAGetLastError(); // hoge == 10035となる。 14 15 // return; 16 //} 17 18 // 同じことしているはずなのに失敗するコード 19 if( !sc.Create()) return; 20 if( !sc.AsyncSelect(FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE)) return; 21 if( !sc.Connect(_T("192.168.1.10"), 9000){ // やってる事は同じはずなのにCAsyncSocketクラスそのままだとnRet==0になる 22 int hoge = WSAGetLastError(); // hoge == 10035となる。 23 return; 24 } 25 26}

試したこと

サンプルのほうに自作のソリューションで発生しているのと同様の現象を発生させようと目に付いた見慣れないマクロをコメントアウトしたりしましたが、接続が成功します。
ソリューションのプロパティから追加のライブラリディレクトリや追加のインクルードファイルを確認しましたが特に追加されているものはありませんでした。

補足情報(FW/ツールのバージョンなど)

  • VisualStudio2015SP
  • Windows7/64bit SP1
  • c++/MFC

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ooa

2018/02/28 06:31

サンプルのほうの該当箇所を載せることはできないでしょうか
notgoodpg

2018/02/28 06:40

出来れば乗せたいのですが安易に公開できないコードなのでご容赦ください。ちなみに、サンプルではCASyncSocketを継承したクラスで接続を行っています。といってもConnectなどのオーバーライドはせずOnConnectなどのイベント時の動作のみオーバーライドしています。よって、上記コードではCASyncSocketの関数が直接呼ばれているはずです。また、上記のコードのみ残して接続してもサンプルコードのほうでは接続ができます。
guest

回答1

0

自己解決

//いろいろ試すうち、戻り値をint nRetとして持たせたほうを動かしたいソリューションのほうに実装してみたところ動いたので解決にします。
//ただ手順は実質同じことをしているはずのもともとのコードでは相変わらず0 (==FALSE)が返ります。
//
//といった経過で何を質問にしたらいいのか分からなくなったので締めます。ありがとうございました。

よくよく見たところ提示したソースが間違っていました。「動く」としていたコードではConnect関数の戻り値をまったく考慮していませんでした。
嘘のソースを提示していました。お騒がせして申し訳ありませんでした。

しかしConnect関数の戻り値を接続の判定に利用しないのはまったく不可解ですね・・・
かといって正しく利用するとなるとイベントを捕まえなくてはならないようですし、そうなるとかなり都合が悪くなってしまいます・・・CSocketを使ったほうがマシなのかもしれません

投稿2018/02/28 07:22

編集2018/02/28 07:30
notgoodpg

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問