C ++ recv () проблема - PullRequest
       2

C ++ recv () проблема

1 голос
/ 30 января 2011

Я хочу отправить строку "Hello there", но я получаю только "re". Почему это так?

void Accept()
{
    SOCKADDR_IN sock;
    int intsock = sizeof(sock);
    remoteSocket = ::accept(desc, (LPSOCKADDR)&sock,  &intsock);
    if(remoteSocket == -1)
    {
        cout << "Error in Accept()" << endl;
    }
    HandleConnection();
}

void HandleConnection()
{
    cout << "You are connected !!!" << endl;
    char* temp = new char[20];
    Recv(temp);
    cout << temp << endl;
}

void Send(const char* buffer)
{
    if((::send(remoteSocket, buffer, strlen(buffer), 0)) < 0)
    {
        cout << "Error in Send()" << endl;
    }
}

void Recv(char* buffer)
{
    int n = 0;
    while((n = ::recv(remoteSocket, buffer, strlen(buffer), 0)) 0)
    {
        buffer[n] = 0;
    }
}

~Server()
{
    WSACleanup();
}

};

int main()
{
    Server s;
    s.Initialize();
    s.Socket();
    s.Bind();
    s.Listen();
    while(1)
    {
        s.Accept();
    }
    return 0;
}

Ответы [ 3 ]

5 голосов
/ 30 января 2011

Несмотря на проблему с деструктором, указанную @ Billy ONeal , вы делаете recv() в цикле, но каждый раз перезаписываете полученный буфер.Я считаю, что вы хотите что-то вроде этого:

// Pass buffer and its real size. This function takes care of NULL termination.
size_t Recv(char* buffer, size_t size) {
    size_t total = 0, n = 0;
    while((n = ::recv(remoteSocket, buffer+total, size-total-1, 0)) > 0) {
        total += n;
    }
    buffer[total] = 0;
    return total;
}

int main() {
    char buffer[128];
    // Connect or whatever (and set your global remoteSocket)
    Recv(buffer, sizeof(buffer));
    cout << buffer << endl;
    return 0;
}
3 голосов
/ 30 января 2011

Я думаю, что проблема в этой строке кода while((n = ::recv(remoteSocket, buffer, strlen(buffer), 0)) 0)

Вы используете strlen(buffer) для получения неверного размера буфера, вы должны передать sizeof(buffer) в вашу Recv функцию.

Если это не проблема, то это одна из проблем: P

Edit:

Как указали Кицунэ и Марк, sizeof (буфер) вернул бы 4 или 8 байт, поскольку он расположен в куче и является просто указателем на блок памяти. Если вы решите использовать стек (char buffer[20] вместо new char[20]), вы можете передать sizeof (буфер) в вашу функцию Recv. В противном случае, просто используйте жестко 20.

Вот как должен выглядеть ваш код:

void HandleConnection()
{
    cout << "You are connected !!!" << endl;
    char temp[20]; // <-- now we have an array
    Recv(temp, sizeof(temp)); // <-- sizeof(temp) will give us 20, not 4 anymore
    cout << temp << endl;
}

Recv(char* buffer, size_t buffer_size)
{
    recv(remoteSocket, buffer, buffer_size, 0);
}
2 голосов
/ 30 января 2011

Вам нужно указать, насколько велик буфер, который принимает данные - это не strlen(buffer).

Вы можете использовать sizeof(buffer), если буферный массив определен локально как массив (отсутствует в списке параметров), или если буфер является глобальным или массивом области действия файла, определение которого видно в функции. В противном случае вам необходимо использовать дополнительный параметр размера буфера, который вы передаете в функцию Recv(), то есть, если буфер определен в другой функции или он динамически выделен. (В коде определение массива не отображается в Recv(), поэтому вам нужно убедиться, что Recv() как-то знает размер - либо как явный дополнительный аргумент, либо потому что вы помещаете буфер в соответствующий класс, который включает метод, который сообщает вам, сколько места выделено для буфера, который он содержит.

Конечно, указанный код не компилируется, потому что buffer фактически нигде не определен и не объявлен.

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