0

当我尝试打印缓冲区时,我的应用程序崩溃了。否则,它工作正常。这是代码:

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;
        }

   }

主文件

 IRC client;

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


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

2 回答 2

0

如果要打印第一个字符,请使用

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

如果你想打印整个,那么 sockread 应该返回整个缓冲区,而不是第一个字符。为此,您需要返回缓冲区第一个元素的地址,在这种情况下,该地址应该已经动态分配。

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

编辑经过思考,我认为您希望后者sockread()通过以下方式更改功能:

  • 将返回类型从chartochar*或更好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;

hth

于 2010-11-28T19:25:46.840 回答
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!");
}
于 2010-11-28T20:18:22.497 回答