ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TCP传输中的字符串比较错误

2019-12-01 06:51:16  阅读:286  来源: 互联网

标签:network-programming c-3 linux string


我已经在c中编写了一个程序,以将文件从c中的客户端逐行发送到服务器.文件完全传输后,我在txt文件中提供了一个endoffile行,以便在服务器中进行字符串比较,以标识该文件已结束并且下一个文件正在传输.下一个文件必须写入服务器中的另一个文件.但是问题在于,strcmp永远不会检测代码中的终结,并且从客户端中的文件接收到终结,因为相等的字符串和amd继续将客户端中的下一个文件写入服务器中的同一文件.

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] = '\0';
   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, sizeof(line), 0);
}

我必须在条件中进行什么更改才能解决问题并从do …. while();中退出代码.环.提前致谢.
操作平台:Linux

Edit1:编辑do …. while()如下:

do
    {
       rewind(appcrt);
       bytes_recieved = recv(pass_arg.connected, recv_data_c, 100, 0);
       recv_data_c[bytes_recieved] = '\0';
       fputs(recv_data_c, appcrt);
       printf("%s-%s",enof,recv_data_c);
       //if(strcmp(enof,recv_data_c) == 0){break;}
    }while(check<count);

在终端中获得以下输出:

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
.
.
.

仍然没有希望.

解决方法:

即使客户端一次向套接字写入一条线,这也不是服务器将如何使用它的方式,因为通过套接字传输的数据只是字节流.服务器必须读取下一个新的行字符,然后进行比较.一个简单的算法可以一次读取一个字节,并检查它是否为换行符,如果不是,则将其追加到字符串中,直到读取换行符为止:

/* Read next line. */
memset(line, 0, 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, line, sizeof(line), 0);

至:

send(sock, line, strlen(line), 0);

并检查send()的返回值以确定它是否成功.
>以下内容是错误的,因为它只会读取以前读取的最大内容(或者如果初始化为空字符串,则不会读取任何内容):

bytes_recieved = recv(pass_arg.connected,
                          recv_data_c, strlen(recv_data_c), 0);

再次检查返回值,尤其是在将返回值用于索引数组时.如果recv()失败,则返回-1,这将导致对数组的越界访问,从而导致未定义的行为.

标签:network-programming,c-3,linux,string
来源: https://codeday.me/bug/20191201/2078751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有