-1

C++ プログラムの 1 つに非常に大きな奇妙な問題があります (ソース コードはこちら: https://github.com/dermesser/libsocket )。

まず、それに関するいくつかの詳細: 基本クラス (C++/socket.cpp のソケット)、(仮想) 派生クラス (C++/unixbase.cpp の unix_socket)、および「リーフ」クラス (unix_stream_server) があります。データメンバ「sfd」は、「socket」(socket.cpp) で宣言および初期化されます。しかし、unix_stream_server::setup (C++/unixserverstream.cpp) では、「sfd」がまったく異なる値になっています。少しデバッグ出力:

socket constr -1 # <--- "socket" constructor
unix_socket constr - sfd: 1447345536 # <---- unix_socket constructor
setup final: 1447345536 # <--- unix_stream_server::setup
unixserverstream.cpp:76: unix_stream_server::setup: Socket already set up!

最後の行は、例外によって渡されたエラー メッセージです。プログラムをデバッグしても同じ結果が得られます。

奇妙なことに、変数の値が大きく変化し、その理由がわかりません。また、同様の継承パスを持つ兄弟クラスでは、この問題は存在しません。

編集1:「sfd」を再割り当てしても問題は消えません。それは単に同じ奇妙な値のままです。

私が解決したいくつかの問題と私が試したこと:

  • 定義/宣言の不一致 (私は知っていますが、これはこのソフトウェアでは非常に奇妙です)
  • パブリックエリアに「sfd」を配置する

問題になる可能性があること: プログラム (examples++/unix_server_stream.cpp) を静的または動的に (Makefile によって生成された SO に対して) リンクすると、問題が発生します。

私は必死です:(誰かがそのような問題についてアイデアや経験を持っていますか?それとも私は疲れすぎて解決策を見つけることができませんか?

編集 2: コードを投稿するのは難しいです。どの部分を投稿すればいいのかわからないので、githubリポジトリのファイルへのヒントに従ってください。:| 申し訳ありません... (そして、私があなたに働いてほしいとは思わないでください - 正しいコードを選択するのは難しいだけです)

unix_stream_server::setup():

if ( sfd != -1 )
        throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Socket already set up!\n");
if ( path == NULL )
        throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Path is NULL!\n");

    sfd = create_unix_server_socket(path,STREAM,flags);

    _path.assign(path);

if ( sfd < 0 )
        throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Error at creating UNIX   stream server socket!\n");
4

1 に答える 1

0

ヘッダーにbool listeningは の定義class unix_stream_serverがありますが、.cppファイルにはメンバーclass unix_stream_serverを省略した別の定義があります。bool listeningそうしないでください。真剣に、それをしないでください。実装ファイルからヘッダーをインクルードしてください! お願いします!

于 2012-08-16T22:02:06.567 に答える