簡體   English   中英

C ++ recv()問題

[英]C++ recv() problem

我想發送一個字符串“ 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;
}

盡管@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;
}

我認為問題是這行代碼while((n = ::recv(remoteSocket, buffer, strlen(buffer), 0)) 0)

您正在使用strlen(buffer)來獲取不正確的緩沖區大小,您應該將sizeof(buffer)傳遞給Recv函數。

如果那不是問題,那么這是問題之一:P

編輯:

正如Kitsune和Mark所指出的,sizeof(buffer)將返回4或8個字節,因為它是在堆上分配的,並且僅僅是指向內存塊的指針。 如果選擇使用堆棧( char buffer[20]而不是new char[20] ),則可以將sizeof(buffer)傳遞給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);
}

您需要指定接收數據的緩沖區的大小-它不是strlen(buffer)

如果緩沖區數組在本地定義為數組(不在參數列表中),或者緩沖區是在函數中可見的全局或文件范圍數組,則可以使用sizeof(buffer) 否則,您需要使用傳遞給Recv()函數的額外緩沖區大小參數-也就是說,如果緩沖區是在另一個函數中定義的,或者是動態分配的。 (在代碼中,數組定義在Recv()不可見,因此您需要確保Recv()以某種方式知道大小-作為顯式的額外參數,或者因為將緩沖區包裝在一個適當的類中,該類包括告訴您為其持有的緩沖區分配了多少空間的方法。

當然,所示的代碼不會編譯,因為buffer實際上並未在任何地方定義或聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM