在C(UNIX)中,如何使用套接字在多个块中传输和接收文件?
例如,如果我有一个 1234 字节的文件,并且块大小为500,我会转移:
我尝试使用fseek,read,write,但是我无法正确使用逻辑。即使是很好的参考也会非常感激。
我的套接字例程是:
int readn(sd, chunk, bytesToRead);
int writen(sd, chunk, bytesToWrite);
答案 0 :(得分:3)
如果您正在使用TCP,那么您需要做的就是发送数据块(我假设您有某种协议可以告诉您块中有多少字节,例如标题?)以及何时获得另一端的块只需将其写入您要写入的文件即可。 TCP将处理确保所有内容都按预期顺序到达,因此您应该能够一步一步地读取X字节中的文件并发送它们,然后在recv端,您只需回收数据并编写它到文件...请记住,您在套接字上发出的每个读取都可以返回1到“块大小”字节之间的任何位置,并且您的协议应该能够告诉您预期的数量,然后您应该循环直到您拥有实际上得到的字节数和你期望的一样多......
如果您正在使用UDP,那么事情会变得更有趣,因为您需要跟踪特定数据报所代表的块...
家庭作业问题?
答案 1 :(得分:1)
在我的头脑中(未编译,因此将其视为伪代码):
bytesRemaining = 1234;
chunkSize = 500;
offset = 0;
bytesWritten = 0;
while(bytesRemaining > 0)
{
if(bytesRemaining < chunkSize)
bytesToWrite = bytesRemaining;
else
bytesToWrite = chunkSize;
writen(sd, chunk+offset, bytesToWrite);
offset += bytesToWrite;
bytesRemaining -= bytesToWrite;
}
或者如果writen()返回写入的字节数:
bytesRemaining = 1234;
chunkSize = 500;
offset = 0;
bytesWritten = 0;
while(bytesRemaining > 0)
{
if(bytesRemaining < chunkSize)
bytesToWrite = bytesRemaining;
else
bytesToWrite = chunkSize;
bytesWritten = writen(sd, chunk+offset, bytesToWrite);
offset += bytesWritten;
bytesRemaining -= bytesWritten;
}
相同的逻辑可以应用于readn()情况。
答案 2 :(得分:0)
你有正确的想法。要做的主要是确保您的IO调用实际上按照您告诉他们的方式进行...这意味着检查他们的返回代码以确保他们写入或读取您预期的金额...此外,它看起来就像你已经包装了读写......也许你应该首先确保它们是完全正确的......
答案 3 :(得分:0)
读取只会获得当时实际缓冲的字节数或最大玩具指定的字节数。因此,如果您经常阅读,您将获得更小的块。如果这很重要(我不知道为什么会这样),你需要整理自己的二级缓冲区中的数据,直到你得到你期望的数字。
当然,您可以使用非常好的文件传输协议,例如FTP。