2012-05-16 63 views
1

我在C语言环境下开发了一个应用程序。这个应用程序的工作原理,但在一段时间后(5小时或更多),其性能是不稳定的。 这是背景。我有一些远程计算机(少于400或 ),每5分钟通过套接字(我的应用程序)发送它的数据。所有 过程是一个循环,我需要整天工作。该应用程序首先发送 数据(如果存在),然后接收数据(还有,如果存在)。我的应用程序像服务器端一样工作 有一些参数,或者它的作用像一个客户端 与其他参数。该应用程序在服务器模式下工作,在收听状态后, 仅等待客户端连接。一旦它连接了一个客户端, 客户端模式下的应用程序发送一条消息,指示将发送 数据,然后发送一个新的消息,其大小和名称连接到服务器端的 (始终发送64字节,所以我的应用程序写入64字节和 对方读取64字节),然后发送数据(文件)。服务器 读取文件的大小和名称(64字节), 拆分信息,其他大小存储在一个变量和文件名中 ,然后在收到文件数据后。将变量中存储的 的大小与所读取数​​据的大小进行比较,如果一切正常,则 服务器发送消息并将数据存储在名为 的新文件中,该文件在收到之前就是这样。所以,直到最后一个文件将被发送 它。编程C语言的套接字,发送和接收文件的错误

当我的应用程序正在开发中的状态,我注意到一些 小时后消息,他们已损坏,我的意思是,信息是不完整的 或有更多的数据,很可能在未来的人的数据。所以 文件数据也是如此。那么,我怎样才能通过相同的 套接字发送文件数据??注意:我有一个用于发送和接收文件数据的缓冲区,另外还有一个用于发送和接收文件数据的缓冲区。

和其他问题: 原始代码:

int copydata(int readfd, int writefd, int offset, int bytes) { 
    char buffer[4096]; 
    int crbytes = 0, cwbytes = 0, trbytes = 0, twbytes = 0; 
    if (offset) { 
    if (lseek(readfd, offset, SEEK_CUR) < 0) { 
     return -1; 
    } 
    } 
    while ((crbytes = read(readfd, buffer, bytes)) > 0) { 
    if (crbytes < 0) { 
     return -1; 
    } 
    trbytes += crbytes; 
    //printf("dbgmsg::Readed data <%dB> | Total readed data <%dB>\n", crbytes, trbytes); 
    while (crbytes > 0) { 
     cwbytes = write(writefd, buffer, crbytes); 
     if (cwbytes < 0) { 
     return -1; 
     } 
     twbytes += cwbytes; 
     crbytes -= cwbytes; 
     //printf("dbgmsg::Written data <%dB> | Total written data <%dB>\n", cwbytes, twbytes); 
    } 
    } 
    return twbytes; 
} 

这段代码是用来发送和接收文件数据。发送 数据的一面使用我们要发送的文件的文件描述符(至 读取)<readfd>并写入套接字的文件描述符(至 写入)<writefd>。接收数据的一面,使用<readfd>从套接字文件描述符中读取 ,使用<writefd>从要写入数据的文件中写入文件 描述符。 如果在使用前被发送的其它消息这个功能,两者的,客户端和 服务器会被卡在所述内的端部“而循环”,在其他 即,客户端发送所有文件数据,并且服务器接收所有 文件数据(在这一点上,收到的数据是完整的,我怎么知道? 因为我可以打开收到的文件)。没有错误,只有一个,“没有消息 所需的类型”。如果我在这个功能之前没有发送消息,那么所有的作品 都可以。 为了避免这个小问题,我修改了代码,并将文件大小传递为 参数,然后在两个while之间写入一个if结构。

int copydata(int readfd, int filesz, int writefd, int offset, int bytes) { 
    char buffer[4096]; 
    int crbytes = 0, cwbytes = 0, trbytes = 0, twbytes = 0; 
    if (offset) { 
    if (lseek(readfd, offset, SEEK_CUR) < 0) { 
     return -1; 
    } 
    } 
    while ((crbytes = read(readfd, buffer, bytes)) > 0) { 
    if (crbytes < 0) { 
     return -1; 
    } 
    trbytes += crbytes; 
    //printf("dbgmsg::Readed data <%dB> | Total readed data <%dB>\n", crbytes, trbytes); 
    while (crbytes > 0) { 
     cwbytes = write(writefd, buffer, crbytes); 
     if (cwbytes < 0) { 
     return -1; 
     } 
     twbytes += cwbytes; 
     crbytes -= cwbytes; 
     //printf("dbgmsg::Written data <%dB> | Total written data <%dB>\n", cwbytes, twbytes); 
    } 
    if (twbytes == filesz) { break; } 
    } 
    return twbytes; 
} 

感谢您的提前,抱歉我的英语!

回答

0

如果程序遇到一个“不完整”的write(),您的内环重新发送缓冲区的开始。

while (crbytes > 0) { 
     cwbytes = write(writefd, buffer, crbytes); 
     if (cwbytes < 0) { 
     return -1; 
     } 
     twbytes += cwbytes; 
     crbytes -= cwbytes; 
     //printf("dbgmsg::Written data <%dB> | Total written data <%dB>\n", cwbytes, twbytes); 
    } 

你可以改变它的东西,如:

for (sentbytes=0; sentbytes < crbytes; sentbytes += cwbytes) { 
     cwbytes = write(writefd, buffer+sentbytes, crbytes - sentbytes); 
     if (cwbytes < 0) { return -1; } 
     twbytes += cwbytes; 
    }