[c++]Странное поведение

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by KwanzaBot, 16 May 2011.

  1. KwanzaBot

    KwanzaBot New Member

    Joined:
    24 Apr 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Как я понимаю, то тут какая-то проблема с стеком, хотя может это я нуб.
    Есть код:

    Code:
    std::string& func()
    {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    sockaddr_in _sockaddr;
    _sockaddr.sin_family = AF_INET;
    _sockaddr.sin_port = htons(80);
    _sockaddr.sin_addr.s_addr = inet_addr("10.0.0.7");
    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    connect(sock, (sockaddr *)&_sockaddr, sizeof(_sockaddr));
    std::string buf = "Тут http-запрос. С ним все ок)";
    char to[1024];
    char from[1024];
    strcat(to, buf.c_str());
    send(sock, to, sizeof(to), 0);
    recv(sock, from, sizeof(from), 0);
    rtrn += from;
    std::string x = "=)";
    return x;
    }

    Функция возвращает, как видно, x. Делаю что-то типа:

    Code:
    std::cout << func();

    Но место смайлика появляется в консоли html-код, то есть rtvn, и сразу программа завершается с ошибкой. Как так?
     
  2. edge911

    edge911 Active Member

    Joined:
    21 Feb 2009
    Messages:
    105
    Likes Received:
    142
    Reputations:
    15
    так выводит мусор
    (мб все дело в том, что при return значения из функции объект x уничтожается)
    Code:
    string x = "=)";
    return x;
    
    а так все ок
    Code:
    string *x = new string("=)");
    return *x;
    
     
  3. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Code:
    std::string& func()
    Заменить на
    Code:
    std::string func()
    и всё.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    strcat(to, buf.c_str());

    у тебя to не инициализирован и по этому можешь словить переполнение буфера. так что юзай strcpy или предварительно в сделай to[0] = 0x00;

    К томуже send(sock, to, sizeof(to), 0);
    ты отошлешь все 1024 данных. хотя по факту http запрос короче по этому юзай вместо sizeof - strlen
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    А я бы сделал
    Code:
    char buf[] = "Тут http-запрос. С ним все ок)";
    send(sock, buf, sizeof(buf), 0);
    
    + к этому обязательно нужно проверку делать количества принятых и отправленных байт, так как TCP/IP потоковый протокол и твое сообщение может не уместиться в окно TCP... в общем вот тут я размусоливал азы, прочитай, пойми или скопируй.
     
    _________________________