• ベストアンサー

MFCでソケット通信がしたいのですができません

http://www.g-ishihara.com/mfc_nw_01.htm このサイトを参考に作っているのですが、次のようなエラーメッセージが出て動きません。 「Error : この操作を正しく終了しました。」 これはどういう意味でしょう? 調べてもよくわかりません。 ちなみに各エディットボックスの変数値はすべて、CString,Value型にしています。

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

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.2

LAN->WAN->LANの場合、経験上正しく接続できないルータが存在します。 同一PC上にサーバとクライアントが存在するのであれば、開発中は 127.0.0.1(自ホスト)へ接続し、動作確認の際には実際にWANの向こう (会社、学校、ネットカフェなど)から接続試験を行うと良いと思います。 また、ソケット関連のプログラミングで問題が起きた場合、パケットキャプチャが しばしば有効です。 Wiresharkなどをインストールし、具体的にどのパケットまで出ていて 誰がどのパケットに応答しないのか確認しましょう。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.1

どこかでerr=1になっているので、「(6)エラー表示」のブロックが実行されています。 では、どこまではerr=0であったか確認されましたか? CSocketのメンバ関数を最後にコールした際に、「この操作を正しく終了しました。」を示す 終了ステートで終了(つまり正常終了)していることになります。 ただ、ご質問の文章とソースでは、最後にコールしたメンバ関数がどれであるのか判断できません。 憶測では、recv == 0のところをエラー判定してしまうと20バイト以下のデータを受信した際に エラーと誤判定するバグがあるような気もします。 確認してませんけど。

tcshacina
質問者

補足

間違いはIP入力とポート番号を逆に入れていたことでした。 ここまではわかったのですが、LAN->WAN->LANへの通信がうまくいきません。ポートを開けて、外部からパケットをサーバに送るようにルータを設定しました。このとき自分のPCでサーバとクライアントを動かして、クライアントから自分のグローバルアドレス向けにパケットを送っても「Error : 対象のコンピュータによって拒否されたため、接続できませんでした。」というエラーが出てしまい、正常な通信ができません。どうすればいいのでしょうか?よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MFC コンボボックスを複数扱う

    環境:VC++2008 MFC 同じリストの内容を持つコンボボックスを16個作りたい。(IDC_COMBO1~16) 16個のDDX変数を用意し、16回値を格納するのは綺麗じゃないので1個のDDX変数でなんとかしたいです。 ソースは以下の物で練習しています。 http://www.g-ishihara.com/mfc_cb_01.htm どのようにすれば簡潔にかけるでしょうか?

  • Microsoft Visual C++ 2008 Express EditionでMFCアプリケーション ウィザードはどこですか?

    今、Microsoft Visual C++ 2008 Express Editionでソケットプログラムに関して勉強中で、 http://www.g-ishihara.com/mfc_nw_01.htm このサイトにあるサンプルプログラムをやりたいと思っているのですが、このページの冒頭に出てくる”MFCアプリケーションウィザード”というのはMicrosoft Visual C++ 2008 Express Editionではどこでできるのでしょうか?

  • VC++2010 MFC エディットボックスの質問

    VC++2010 MFC エディットボックスの質問なんですが、 バリュー型変数を使わないでどうやったら配列(char型8byte(unsigned char[8]))の中身すべてをエディットボックスにいれて表示することができますか?よろしくお願いします。配列の中身は文字もあったりします

  • CWnd::EnableWindow()の扱い方

     CWnd::EnableWindow()で有効、無効を切り替えるというのはわかりますが、エディットボックスの有効、無効を切り替えるにはどうしたらいいでしょうか? 現在MFCで開発していますが、エディットボックスのメンバ変数にはCStringを使っているので、EnableWindowの使い方がわかりません。 動作環境はWindows2000とNTです。 ツールはVC++6.0を使用しています。

  • サンプルソースが実行できない

    VC++2005でMFCダイアログベースのアプリを作成しています。 下記サイトのサンプルソース、 手順1:http://www.g-ishihara.com/mfc_ta_01.htm 手順2:http://www.g-ishihara.com/mfc_ta_02.htm の全く同じ通りに、コーディングし実行してみたのですが、 コンパイルは通りますが、添付ファイルのようなエラーが出てしまい、 exeファイルを実行できません。 手順2の下記コード // 初期表示 if (!err) OnTcnSelchangeTab(0, 0); をコメントアウトしたところ、実行できるようですが。。。 対象ソースが参考URL上にあり大変申し訳ありませんが、 解決法をご存知の方おられましたら、ご教授お願いできませんでしょうか。

  • MFCで変数の追加を選択したらWebページエラー

    MFCでダイアログベースのアプリを作成しようと思い、エディットボックスを配置した後、変数の追加を行なおうとしたところ、 「Webページエラー」というダイアログが現れました。 「デバッグしますか?」と訊かれたので「いいえ」を選択すると、変数の追加ダイアログが表示されたのですが、 なぜか変数の種類のエディットボックスが表示されず、変数名を設定し強引に完了ボタンをクリックした後 ビルドしても「○○(変数名)が定義されていない」とエラーになってしまいます。 このような現象になった方はいるでしょうか? これはどのようにすれば解決できるのでしょうか? 環境は、 WindowsXP Home Version2002 SP3 VisualStudio2008 Professional Edition 90日評価版 宜しくお願いします。

  • MFC:リッチエディットからUnicode文字列を受け取りたい

    MFCのダイアログベースでプロジェクトを作成 ↓ プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更 ↓ エディットボックスとリッチエディット2.0を適当に配置 ↓ エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加 ↓ InitInstance()内に AfxInitRichEdit2(); を追加 ↓ あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。     すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。 例えば“Å”の半角文字を(Unicode紹介サイトからコピペする等して)入力すると、エディットボックスではそのまま“Å”なのに、リッチエディット2.0では“A”になります。   ※入力している段階では“Å”と表示されています。GetWindowText関数で取得すると“A”になってしまいます。     リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。

  • MFC Timerについて

    MFCのTimerの利用方法をいろいろ調べたのですが。 理解できずに困っています。 MFCのダイアログベースで作成し、ボタンを押したら Timer(1秒ごと)でエディットボックスに表示させるというものです。 ・ベースのウィンドウにボタンとエディットボックスを作成しました。 ・次に ボタンをダブルクリックし以下のように書きました。 void CtestDlg::OnBnClickedButton() {     int x=0; char buf[10000]; x++; sprintf(buf,"%d",x); (labelの変数名)_edit.SetWindowText(buf); } ・SetTimer(1, 1000, NULL);を用いて ボタンがクリックされたら1秒ごとにxの値をエディットボックスに表示させるようにしたいのですが。 OnTimer(UINT nIDEvent) Close()やKillTimer(1);をもちいらなければならないことはわかったのですが。 作業手順がわかりません。 詳しい 作業手順をおしえてください。 プログラム完成まで 教えていただけるととてもうれしいです。 プログラマーの方よろしくお願いします。

  • 同じエディットボックスへのDrag&Drop(VC++/MFC)

    同じエディットボックスへのDrag&Drop(VC++/MFC) 同じエディットボックスへDrag&Dropすると テキストが消えてしまう現象に悩んでいます。 現在、 下記のサイト http://www.softist.com/programming/dandd/dandd.htm のサンプルプログラムを参考に コントロール間のDrag&Dropの仕方を学習しています。 このサンプルではエディットボックス間で文字列のコピーができるようになっていますが、 私がほしい機能は文字列の移動です。 そこで、サンプルのEditForDD.cppの DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY); の下に、 if(DropEffect == DROPEFFECT_COPY) this->SetWindowTextA(""); という一文を加えて、Drag&Dropする際にDrag元のテキストを削除するようにしました。 その結果、異なるエディットボックス間での移動は可能になりましたが、 Drag元のエディットボックスにテキストを戻そうとすると テキストが消えてしまいまうようになってしまいました。 このように同じエディットボックスにDrag&Dropをしても テキストが消えないようにする方法をご存じの方はいらっしゃいませんでしょうか? なお、開発環境は以下の通りです。 開発環境:Visual Studio 2005 Standard Edition 利用言語:VC++/MFC OS:Windows XP よろしくお願いいたします。

  • DOSコマンドよりMFCアプリ起動でエラーダイアログ

    いつもお世話になっております。 DOSコマンドからMFCアプリケーションを起動したら、 アプリケーションエラーのダイアログが出力しました。 メッセージ文言 「"0xNNNNNNNN"の命令が"0xNNNNNNNN"のメモリを参照しました。 メモリが"written"になることはできませんでした。 プログラムを終了するには[OK]をクリックしてください」 開発環境 OS Windows XP SP2 VC++ MicroSoft Visual C++ Ver6.0 Enterprise Edition 実行環境 OS Windows Server 2003 Enterprise Edition SP2 (但しWindows Server 2000で実行したところ、上記現象は起こりませんでした。試しにWindows XP SP2(開発環境)で実行したら、上記現象は起こりました。) 条件は以下の1~5が同時に成立した場合にダイアログが出力します 1. MFCをダイナミックリンク(スタティックリンクはOKでした) 2. グローバル変数(CString型)に129桁以上を設定(128桁の場合、OKでした) 3. ローカル変数(CString型)に65桁以上を設定(64桁の場合、OKでした) 4. MFCの関数:CFile::GetStatus()をコール(第一引数のファイルは実際に存在する/しないに関わらず、エラーダイアログは出力します) 5. SDKの関数:ExitProcess()をコール 原因がわかる方がいましたら、教えて頂けませんか?? 宜しくお願い致します。 実装は以下のような感じです。 //グローバル変数定義 CString g_wk; (.hではなく、.cppに直接記述してあります) BOOL CTest01Dlg::OnInitDialog() { CDialog::OnInitDialog(); //↓↓↓↓↓ここから↓↓↓↓↓ CString l_wk = "1234567…56789"; // 129桁 g_wk = "1234567…56789"; // 65桁 CFileStatus s; BOOL bl = CFile::GetStatus("a", s); ExitProcess(0); //↑↑↑↑↑ここまで↑↑↑↑↑ return TRUE; }