2010-11-28 67 views
0

當我嘗試打印緩衝區時,我的應用程序崩潰。否則,它工作正常。 這是代碼:如何從使用winsock從套接字recv的函數返回char?

irc.h

class IRC 
      { 
       public: 
         void sockconnect(char * hName, int portNum); 
          void sockwrite(char* sendbuf); 
          char sockread(void); 
          bool connected; 
        private: 
          WSADATA wsaData; 
          SOCKET m_socket; 
          sockaddr_in clientService; 
          LPHOSTENT hostEntry; 

}; 

irc.cc

char IRC::sockread(void) 

    { 
    int result; 
    char buffer[DEFAULT_BUFLEN]; 
     result = recv(m_socket, buffer, DEFAULT_BUFLEN, 0); 

     if (result > 0) { 
      return *buffer; 
       } 
      else if (result == 0) 
       { 
      connected = false; 
       return *buffer; 
       } 
      else { 
     printf("recv failed with error: %d\n", WSAGetLastError()); 
     return *buffer; 
     } 

    } 

main.cc

IRC client; 

while (client.connected == true) { 
    char buffer = client.sockread(); 
     if (buffer == NULL) 
      break; 


     printf ("Buffer: %s\n",buffer); 
     } 

回答

0

如果你要打印的第一個字符使用

printf ("Buffer: %c\n",buffer); 

如果你想打印整個然後sockread應該返回整個緩衝區,而不是第一個字符。爲此,您將需要返回緩衝區的第一個元素的地址,在這種情況下應該已經動態分配。

printf ("Buffer: %s\n",buffer); 

編輯以爲我想你想後者爲改變下列方式sockread()功能後:

  • 變化的返回類型從charchar*或更好const char*
  • char buffer[DEFAULT_BUFLEN];char* buffer = new char[DEFAULT_BUFLEN];
  • return *bufferreturn buffer

而且,在這種情況下,不要忘記刪除緩存

const char* buffer = client.sockread(); //not char buffer as in your code 
printf ("Buffer: %s\n",buffer); 
delete [] buffer; 

心連心

+0

對不起,我不明白。那不是我現在正在做的事情嗎? – thorvald 2010-11-28 19:28:07

+0

@thorvald:不,實際上你只返回第一個字符。查看我的編輯 – 2010-11-28 19:29:49

0

您需要使用的std :: string。您不能返回該緩衝區 - 它在本地堆棧上。即使你成功地返回了一個實際的指針而不是一個單一的字符,這就是你所做的,那麼它將超出範圍,其中的數據將失效。

std :: string負責處理所有這些問題。你只需要使用它,就完成了。您還有其他問題,例如實際失敗時無效返回緩衝區。這是例外情況。

std::string IRC::sockread() 
{ 
    std::string s; 
    s.resize(DEFAULT_BUFLEN); 
    int result = recv(m_socket, &s[0], DEFAULT_BUFLEN, 0); 

    if (result > 0) { 
     return s; 
    } else if (result == 0) { 
     connected = false; 
    } else { 
     std::cout << "recv failed with error " << WSAGetLastError() << "\n"; 
    } 
    throw std::runtime_error("Socket connection failed!"); 
}