我有一个字符指针&使用了malloc之类的
char *message;
message=(char *)malloc(4000*sizeof(char));
稍后我从socket中接收数据如果数据超过4000字节会发生什么?
答案 0 :(得分:1)
我会假设您在询问如果您这样做会发生什么:
recv(socket,message,5000,0);
并且读取的数据量大于4000。
这将是未定义的行为,因此您需要确保它不会发生。无论何时从套接字读取,您都应该能够指定要读取的最大字符数。
答案 1 :(得分:1)
您的问题遗漏了许多有关网络协议的详细信息,请参阅@DavidSchwartz的回答。
但是要专注于存储它的缓冲区:如果你尝试将超过4K字符写入message
分配的内存,你的程序可能会崩溃。
如果您测试收到的邮件大小,可以执行realloc
:
int buf_len = 4000;
char *message;
message = static_cast<char*>(malloc(buf_len));
/* read message, and after you have read 4000 chars, do */
buf_len *= 2;
message = static_cast<char*>(realloc(message, buf_len));
/* rinse and repeat if buffer is still too small */
free(message); // don't forget to clean-up
但这是非常劳动密集型的。只需使用std::string
int buf_len = 4000;
std::string message;
message.reserve(buf_len); // allocate 4K to save on repeated allocations
/* read message, std::string will automatically expand, no worries! */
// destructor will automatically clean-up!
答案 2 :(得分:1)
这取决于几个因素。假设您的代码中没有错误,则取决于您使用的协议。
如果使用TCP,您将永远不会获得比您要求的更多的字节数。下次调用接收函数时,您将获得更多数据。
如果UDP,您可能会被截断,则可能会出现错误(如MSG_TRUNC
)。这取决于您的平台的具体情况以及您如何调用接收功能。我知道没有平台可以为下次调用接收函数保存部分数据报。
当然,如果您的代码中存在错误并且您实际上溢出了缓冲区,则可能会发生非常糟糕的事情。因此,请确保仅将合理的值传递给您正在使用的任何接收函数。
答案 3 :(得分:0)
为获得最佳结果,您会收到分段错误错误