我在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;
}
感谢您的提前,抱歉我的英语!