Как вернуть char из функции, которая использует winsock для восстановления из сокета? - PullRequest
0 голосов
/ 28 ноября 2010

Мое приложение падает, когда я пытаюсь распечатать буфер.В остальном работает нормально.Это код:

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 голосов
/ 28 ноября 2010

Вам необходимо использовать 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!");
}
0 голосов
/ 28 ноября 2010

Если вы хотите напечатать первый символ, используйте

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 *buffer на return buffer

Также в этом случае не забудьте удалить буфер

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

hth

...