我希望在发送包时在服务器上动态分配足够的内存,客户端接收部分内容。即如果我从服务器向客户端发送一个512字节的包,我希望客户端char* receive_data
分配相应的包内存量。
这里有一些伪代码: 我想要一个循环2次的计数器,在第一个循环中它将向客户端/服务器发送包的长度,在第二次运行时它将自己发送包。
int write_all(int socket, void *buffer, size_t *length){
int ret;
int counter = 0;
while (counter != 2) {
if (counter == 0) {
// Write() the length to client/server.
} else {
ret = write(socket, buffer, length);
if(ret < 1) break;
}
counter++;
}
return ret == -1 ? -1 : 0;
这是一个好或坏的方法吗?我可能有隧道视觉,如果你有更合适的方式,请分享。
编辑:http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sendall我已经阅读了这一部分,并认为这可能是另一种方式。但后来我必须静态分配一个字母
(char receive_data[512];
)。哪个可能也有效,但它是否像我试图做的那样灵活?
答案 0 :(得分:1)
编辑:答案的第一部分涉及交替发送邮件大小和消息作为通信协议的适用性
它会起作用,除非你可以不同步。 (即,接收器是否可能错过大小数据包但接收数据包?)
您还应该考虑安全隐患:攻击者可以通过向您发送非常大的数据大小来导致拒绝服务,从而导致您的服务器进程大规模交换或死亡。
通常,通过将网络数据包逻辑拆分为标头和正文部分来解决您的问题,标头中的某些字段指定数据包长度。最大长度限制在合理的范围内。这与你的工作非常相似。
编辑:答案的第二部分涉及短读/写
阅读完最新评论后,我猜您的问题是:
您的通讯是通过TCP进行的。这是你第一次做这样的事情。您已经阅读过有关短读和短写的内容,即read()读取的字节数比您告诉的少,或者写的字节数比您可用的少。你已经读过人们通常如何处理这个问题(簿记),但你想知道是否有更简单的解决方案:如果你只是分配了足够的内存,那么就不需要读写系统调用了没有读/写你告诉他们的一切。
这是关于正确的吗?
然后我的回答是:不,这不是短读/短写问题的有效解决方案。限制因素不是您为这些系统调用提供的内存。您的所有读写操作可能仍然比您告诉他们的时间更短。记账没有简单的方法。