【发布时间】:2011-03-13 21:22:29
【问题描述】:
如果这是愚蠢的,请原谅我,但我是 C/C++ 的新手。
在我正在创建的套接字库中,我的 ClientSocket::recv(int bufsize) 函数使用 'bufsize' 来初始化一个 char[] 数组以从 C 套接字读取。使用 G++ 编译的代码可以正常工作。
我遇到的问题是一些正在编译我的代码的人收到以下错误: socket.cxx||In member function ‘std::string ClientSocket::recv(int)’:|
socket.cxx|269|error: ISO C++ forbids variable length array ‘buffer’|
现在,从我在这个论坛上看到的内容来看,Microsoft 只支持 C89,而 GCC 支持 C99,其中可以接受可变大小的数组。同样在那个线程上,他们建议使用 _alloca() - 问题是,它最多只支持 1mb。我宁愿没有限制。
如果这是使它与 GCC/MSVC++ 交叉编译的唯一可能方法,我想我将不得不接受它。很高兴知道一个替代方案。像 malloc() 这样的东西会起作用吗? (以前从未使用过,所以我不知道)如果是这样,你能告诉我如何使用它或链接到教程/文档吗?谢谢!
P.S.:这是我的 recv() 函数的代码:
std::string ClientSocket::recv(int bufsize) {
// isConnected() is a ClientSocket function
if (!isConnected()) throw SocketException("Not connected.");
char buffer[bufsize+1];
// I did this because sometimes it was returning partial garbage :\
memset(buffer, 0, bufsize);
// the :: prefix means to call the recv() from the header files instead of ClientSocket::recv()
int ret = ::recv(sockfd, buffer, bufsize-1, 0);
if (ret < 0) {
switch(errno) {
case ECONNREFUSED:
throw SocketException("Connection refused on recover.");
break;
case ENOTCONN:
throw SocketException("Not connected.");
break;
default:
throw SocketException("Unknown error reading socket.");
break;
}
} else if (ret == 0) {
// we got disconnected, return empty string. (connected is a protected variable of ClientSocket)
connected = false;
return "";
}
return buffer;
}
编辑:根据建议,我计划使用 vector buffer(bufsize+1, 0); ... recv(sockfd, &buffer[0], bufsize, 0); ... return &buffer[0]; 或 char *buffer = new char[bufsize + 1]; memset(buffer, 0, bufsize); ... recv(sockfd, buffer, bufsize, 0); ... string tmp = buffer; delete [] buffer; return string(tmp); - 仍在安装 MSVC++ 以对其进行测试,但我相信它会起作用。太感谢了! StackOverflow 摇滚!
【问题讨论】:
-
我这里可能有点跑题了,但是你需要超过 1 兆字节的 socket io 缓冲区吗?
-
好点。通常我使用 1024 字节,但我将把它作为一个库分发,我不喜欢以任何方式限制它。
-
库的全部意义不在于将行为集中到定义的路径中(这是一种施加限制的形式?)就个人而言,我说合理的限制根本不是问题。开发人员可以非常轻松地绕过合理的限制。如果最终成为问题,他们会告诉你(哦,天哪,天哪,他们会告诉你的!)
-
您没有收到整个传入缓冲区,并且您正在分配一个字节,但您没有设置那个额外的字节;你可能想写 buffer[ret] = 0;返回缓冲区;而是。
-
@Neil - 谢谢,我会这样做的。 :) @glowcoder - 我真的希望它像 python 的套接字库一样,afaik 对 recv() 没有限制。
标签: c++ arrays variables size iso