我用c写了一个程序,将文件从一个客户端一行一行地发送到一个服务器。 文件传输完毕后,我在txt文件中提供了一个line endoffile ,用来比较服务器中的string,以确定文件已经结束,下一个文件正在传输。 下一个文件必须写入服务器中的另一个文件。 但问题是,strcmp从来没有检测到代码中的endoffile , endoffile从客户端的文件中收到,因为相同的stringamd继续将下一个文件从客户端写入服务器中的同一个文件。
char enof[]="endoffile"; ... do { rewind(appcrt); bytes_recieved = recv(pass_arg.connected,recv_data_c,strlen(recv_data_c),0); recv_data_c[bytes_recieved-1] = ' '; fputs(recv_data_c,appcrt); if(strcmp(enof,recv_data_c) == 0){break;} }while(check<count);
文本文件:
Necessary data that is being transmitted to be written to the file endoffile
while (fgets(line,sizeof(line),crt) != NULL) { send(sock,line,0); }
在这种情况下我必须做出什么样的改变,以便问题得到解决,代码从do....while();退出do....while(); 循环。 提前致谢。 操作平台:Linux
整个应用程序中的一个variables
如何在C#GUI窗体中运行batch file
gdb将内存地址解释为对象
检查winform是否隐藏在以独占全屏模式运行的游戏之后
如何通过c ++区分专用和集成的gpu卡?
编辑1:编辑do....while()如下:
do { rewind(appcrt); bytes_recieved = recv(pass_arg.connected,100,0); recv_data_c[bytes_recieved] = ' '; fputs(recv_data_c,appcrt); printf("%s-%s",enof,recv_data_c); //if(strcmp(enof,recv_data_c) == 0){break;} }while(check<count);
在terminal中获得以下输出:
endoffile-file1line1 endoffile-file1line2 endoffile-file1line3 endoffile-file1line4 endoffile-file1line5 endoffile-file1line6 endoffile-endoffile endoffile-file2line1 endoffile-file2line2 endoffile-file2line3 endoffile-file2line4 endoffile-file2line5 endoffile-file2line6 . . .
依然没有希望。
在C中的消息框在Linux中
什么unicode编码(UTF-8,UTF-16,其他)的Windows使用它的Unicode数据types?
为什么在C ++方法中使用system(“some.exe”)不能像命令行一样工作?
io_submit()阻塞,直到前一个操作完成
在同一个系统上有多个GCC的情况下使用哪个版本的libstdc ++。so
即使客户端一次向套接字写入一行,这也不是服务器将如何使用它,因为通过套接字传输的数据只是一个字节流。 服务器必须读取下一个新行字符,然后进行比较。 一个简单的算法会一次读取一个字节,并检查它是否是换行符,如果不是,则将其附加到字符串,直到读取换行符:
/* Read next line. */ memset(line,sizeof(line)); size_t line_len = 0; while (line_len < sizeof(line) - 1 && 1 == recv(pass_arg.connected,&line[line_len],1,0)) { if ('n' == line[line_len]) break; line_len++; }
除此之外,代码还有几个问题:
您需要发送从文件中读取的内容,因为它可能小于sizeof(line) 。 更改:
send(sock,0);
至:
send(sock,strlen(line),0);
并检查send()的返回值以确定它是否成功。
以下是不正确的,因为它只会读取以前读取的最大值(或者如果被初始化为空字符串,则不会被读取):
bytes_recieved = recv(pass_arg.connected,0);
并且再次检查返回值,特别是当返回值被用于索引一个数组时。 如果recv()失败,则返回-1 ,这将导致数组超出边界访问,导致未定义的行为。
while (fgets(line,0); }
不要忘记,如果行是空白的, fgets()只能读取一个字节。 因此,你的send()调用每次调用都会发送大量未初始化的数据 – 前面的行的内容或者你的应用程序早期的随机内存free() d。
因此,您的接收程序需要与以下内容进行比较:
endoffiletten to the file
终于看到最后的字符串。 (假定line缓冲区已经开始全部是ASCII NUL字符)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。