Ошибка Сег на getaddrinfo () - PullRequest
2 голосов
/ 20 июля 2011

Я получаю ошибку сегментации в моем вызове 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, переданный конструктору, преобразуется в 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 вне границ» заставляет меня поверить, что с портом что-то не так, но я не знаю, что может быть не так. Если кто-то может указать на что-то не так, я был бы благодарен. Спасибо за любую помощь.

Ответы [ 3 ]

7 голосов
/ 20 июля 2011
getaddrinfo("127.0.0.1", port, &hints, &servinfo)
                          ^

Это должно быть char *. Я предполагаю, что вы передаете целое число и заставляете библиотеку обращаться к неверному адресу.

EDIT

В свете комментария Благовеста Буюклиева, я полагаю, вы делаете что-то подобное в конструкторе: this->port = (const char*) port.

Вам нужно использовать что-то (snprintf может быть?), Чтобы преобразовать это целое число в char *. Просто кастинг не подойдет .

1 голос
/ 20 июля 2011

Вы должны передавать port по ссылке, а не по значению, то есть &port?0x1356 - это то же значение, что и 4950 - номер порта, который вы пытаетесь использовать.

edit: ОК, я вижу, что это должна быть строка, а не указатель навнутр.Я оставлю свой ответ на месте, поскольку он показывает, что значение порта неправильно интерпретируется как адрес.

0 голосов
/ 20 июля 2011

Вы устанавливаете указатель на порт, но не выделяете для него память.(По крайней мере, это не так, как я вижу в коде, который вы перечислили.)

Порт должен быть строкой (то есть массивом символов), а не указателем на символ.И не целое число тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...