微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过TCP传输string比较错误

我用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

用于从txt文件读取并发送到服务器的代码

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] 举报,一经查实,本站将立刻删除。

相关推荐