我试图接收通过在C.插座一些文件,但服务器发送箱64字节数据包为例如一百万字节的文件和我得到大约999902个字节上的目标文件。

while ((n = read(sd, buffer_in, BUFSIZE ))) //  BUFSIZE = 64 
{
    if(n<0)
    {
       printf("Fail.\n");
       fclose(archivo);
       return -1;
    }

    if(fwrite(buffer_in, n, 1, f) !=1 ) 
    { 
       printf("fwrite error.\n");
       fclose(archivo);
       return -1;
    }

    bytes+=n;
}

printf("We received %d bytes",  bytes);

当通过本地TCP / IP套接字它的工作原理使用,但不能在连接速度慢。我通过调试,我得到了很多的64个字节块,靠近EOF一个30字节块见。我知道,你可以得到一个read()少字节,因为调用返回时将所有数据(> 1个字节)是可用的。但是,这个条件不应该由而被逮住?应返回当n == 0,即没有更多的数据(EOF)。

THX对您有所帮助。

(编辑)

发送代码,如下所示:

while (n=read(file_fd, buffer, BUFSIZE))
{
   write (sdaccept, buffer, n)
}

我知道,无论read()和write()方法可以返回否

(EDIT II)

与10673个字节的C源测试,接收10575无腐败,不同之处在于该目标文件缺少前98个字节!!!

有帮助吗?

解决方案

中提供的发送码忽略写()(或者发送())的插座上没有义务写全缓冲这一事实。

写()/发送()可能决定它部分地写或如果底层子系统拒绝接收更多的数据(例如,网络子系统可以具有用于数据的队列来发送和这个队列已经不是写在所有充分)。这是一个缓慢的连接的可能性高。

在发送侧应检查写()的返回值,以检测有多少数据已被实际写入并相应地调整。

写入应该以某种方式完成这样的:

int readAmount;
while( readAmount = read(file_fd, buffer, BUFSIZE) > 0 )
{
    int totalWritten = 0;
    do {
       int actualWritten;
       actualWritten = write (sdaccept, buffer + totalWritten, readAmount - totalWritten);
       if( actualWritten == - 1 ) {
           //some error occured - quit;
       }
       totalWritten += actualWritten;
    } while( totalWritten < readAmount );
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top