当我尝试打印缓冲区时,我的应用程序崩溃了。否则,它工作正常。 这是代码:
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 :(得分: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 *buffer
至return 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!");
}