• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++ MFC PC間ネットワーク通信に関して)

C++ MFC PC間ネットワーク通信に関する問題

このQ&Aのポイント
  • C++ MFCでPC間のネットワーク通信を行う際に問題が発生しています。
  • 参考にした通信プログラムを組んだが、一部変更してもうまくいかない。
  • MSDNを見ても解決策が見つからないため、助けを求めています。

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

  • ベストアンサー
回答No.1

> デバッグモードでAccept()関数の直後でとめて関数の戻り値をみるとfalseで戻ってきてしまいます。 そのときのエラー・コードは? マニュアル読みましたか? > int SockAddrLen; int SockAddrLen = sizeof(SOCKADDR); ではなくて?

参考URL:
http://msdn.microsoft.com/ja-jp/library/eczhacdy(v=VS.90).aspx
gaku_2011
質問者

お礼

int SockAddrLen = sizeof(SOCKADDR);のように修正しましたら 正常に相手のIPアドレスが読めるようになりました。 一応、参考URLの所は読んだのですが、理解力が足らないようです。 動作してから読んでみると、”なるほど”と思うのですが。 これで前に進むことが出来ます。 ありがとうございました。

その他の回答 (1)

  • sygh
  • ベストアンサー率76% (42/55)
回答No.2

CAsyncSocket::Accept() の第3引数は In/Out パラメータです。Out パラメータではありません。 CAsyncSocket::Accept() の内部で使用されているソケット関数 accept() の宣言部、具体的には Windows SDK の WinSock.h の 745 行目あたりを参照してください。 SAL 注釈で __inout_opt という修飾がなされています。 したがって正しい引数の指定方法は下記になります。 SOCKADDR clientSockAddr = {}; int sockAddrLen = sizeof(clientSockAddr); m_lsnSock.Accept(*m_conSockP, &clientSockAddr, &sockAddrLen); そもそも MSDN というか MFC の説明の仕方に問題があるのですが、そういうときは常に実装を参考にするようにしてください。 MFC はソースコードが開発者に公開されているせいなのか、ヘルプがどれもおざなりになっています。 ちなみにソケット API がなんでこんな面倒な引数の指定方法になっているかというと、クロスプラットフォーム API であるバークレーソケットの歴史が絡んできます。 主に、FreeBSD、Linux、Windows などでのソケットの実装の違いを吸収するためです。 なお、蛇足ですが、C/C++ においてローカル変数名はあまり大文字で始めない方がいいです。

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/winsock/winSock5.html
gaku_2011
質問者

お礼

一応、最初のepistemeさんのメールのように変数を変更したら相手のIPアドレスが 読めるようになりました。 MSDNを読むには、まだ力不足のようです。 メールにある 参考URL:http://wisdom.sakura.ne.jp/system/winapi/winsock/winSock5.html も参考にさせて頂いて、これからもC++の勉強をしていこうと思います。 ありがとうございました。

関連するQ&A