- ベストアンサー
C++ MFC PC間ネットワーク通信に関する問題
- C++ MFCでPC間のネットワーク通信を行う際に問題が発生しています。
- 参考にした通信プログラムを組んだが、一部変更してもうまくいかない。
- MSDNを見ても解決策が見つからないため、助けを求めています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> デバッグモードでAccept()関数の直後でとめて関数の戻り値をみるとfalseで戻ってきてしまいます。 そのときのエラー・コードは? マニュアル読みましたか? > int SockAddrLen; int SockAddrLen = sizeof(SOCKADDR); ではなくて?
その他の回答 (1)
- sygh
- ベストアンサー率76% (42/55)
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++ においてローカル変数名はあまり大文字で始めない方がいいです。
お礼
一応、最初のepistemeさんのメールのように変数を変更したら相手のIPアドレスが 読めるようになりました。 MSDNを読むには、まだ力不足のようです。 メールにある 参考URL:http://wisdom.sakura.ne.jp/system/winapi/winsock/winSock5.html も参考にさせて頂いて、これからもC++の勉強をしていこうと思います。 ありがとうございました。
お礼
int SockAddrLen = sizeof(SOCKADDR);のように修正しましたら 正常に相手のIPアドレスが読めるようになりました。 一応、参考URLの所は読んだのですが、理解力が足らないようです。 動作してから読んでみると、”なるほど”と思うのですが。 これで前に進むことが出来ます。 ありがとうございました。