2

getaddrinfo 呼び出しでセグメンテーション違反が発生しましたが、その理由がわかりません。サーバーとクライアントの両方で発生します。一部のコード (サーバー側) は -

class TcpServer {
public:

    TcpServer(int);
    ~TcpServer();

    void launchServer();

    void communicate();

private:
    const char* port;
    int fd;
    int comm_fd;
};

tcpserver.cpp-

void TcpServer::launchServer() {
    int status;

    struct addrinfo hints;
    struct addrinfo *servinfo;  //will point to the results

    //store the connecting address and size
    struct sockaddr_storage their_addr;
    socklen_t their_addr_size;

    //socket infoS
    memset(&hints, 0, sizeof hints); //make sure the struct is empty
    hints.ai_family = AF_INET;  //local address
    hints.ai_socktype = SOCK_STREAM; //tcp
    hints.ai_flags = AI_PASSIVE;     //use local-host address

    //get server info, put into servinfo
    if ((status = getaddrinfo("127.0.0.1", port, &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
        exit(1);
    }

主に〜

TcpServer server(4950);
server.launchServer();

intコンストラクターに渡された は for ポートにキャストされますconst char*

gdb を実行すると、次のバックトレースが表示されます -

#0  0xb7dca737 in getaddrinfo (name=0x8054824 "127.0.0.1", 
    service=0x1356 <Address 0x1356 out of bounds>, hints=0xbffff20c, 
    pai=0xbffff234) at ../sysdeps/posix/getaddrinfo.c:2080
#1  0x08050f79 in TcpServer::launchServer (this=0xbffff304) at tcpserver.cpp:25
#2  0x0804eae9 in main (argc=1, args=0xbffff3f4) at mainserver.cpp:47

したがって、「アドレス 0x1356 範囲外」は、ポートに問題があると思わせますが、何が問題なのかわかりません。誰かが間違っていることを指摘できれば、私は感謝します。助けてくれてありがとう。

4

3 に答える 3

7
getaddrinfo("127.0.0.1", port, &hints, &servinfo)
                          ^

それはchar *. 整数を渡し、ライブラリに無効なアドレスへのアクセスを強制していると思います。

編集

Blagovest Buyukliev のコメントに照らして、コンストラクターで次のようなことをしていると思いますthis->port = (const char*) port

その整数snprintfchar *. 単純にキャストするだけではうまくいきません

于 2011-07-19T21:25:56.283 に答える
1

port値ではなく参照で渡すことになっています&portか?0x1356 は、使用しようとしているポート番号である 4950 と同じ値です。

編集: OK、int へのポインターではなく、文字列であると思われます。ポート値が誤ってアドレスとして解釈されていることが示されているため、回答はそのままにしておきます。

于 2011-07-19T21:24:02.170 に答える
0

ポートへのポインタを設定していますが、メモリを割り当てていません。(少なくとも、あなたがリストしたコードで見ることができるわけではありません。)

ポートは、char へのポインタではなく、文字列 (つまり、char 配列) である必要があります。また、整数でもありません。

于 2011-07-19T21:28:19.420 に答える