如何从使用winsock的函数返回char来从socket中恢复?

时间:2010-11-28 19:20:58

标签: c++ visual-studio-2010 visual-c++ windows-xp winsock2

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

  • 将返回类型从char更改为char*或更好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

答案 1 :(得分: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!");
}