我正在尝试读取文件并通过网络发送: 下面是我在服务器上用于文件读取和发送的代码,
while((sent = read(fp, send_buf, BUFSIZE)) > 0)
{
write(cssock, send_buf, strlen(send_buf));
memset(send_buf, 0, BUFSIZE);
}
我正在客户端阅读:
while(readBytes = read(sock, file_data, BUFSIZE) > 0)
{
write(fp, file_data, strlen(file_data));
}
文件传输正常,但我在缓冲区的末尾得到一个额外的字符,我的文件被写为:
你好我的名字是abcd garbage-char
garbage-char是一些仲裁字符。知道为什么我会得到这样的额外角色?
注意:我已经仔细检查了我的文件,它只有字符串“我的名字是abcd”。没有空间,没有新线。任何帮助表示赞赏。
答案 0 :(得分:3)
这里的解决方案很简单。使用您收到的数据的长度,而不是字符串的长度。你没有收到“字符串”。您收到了一个任意的字节块,可以是0到255之间的任何值。因此strlen
可能会返回无用的结果。但读取的字节数总是准确的。
答案 1 :(得分:2)
问题的实际原因是POSIX read()
API。它不返回一个以NULL结尾的字符串,它在缓冲区中填充了垃圾字符。
我为解决这个问题所做的工作如下:
while((sent = read(fp, send_buf, BUFSIZE - 1)) > 0)
{
if(sent < BUFSIZE)
send_buf[sent] = '\0';
else
send_buf[BUFSIZE] = '\0';
write(cssock, send_buf, strlen(send_buf));
memset(send_buf, 0, BUFSIZE);
}
它解决了它。谢谢大家的帮助。
答案 2 :(得分:1)
我建议您在服务器中打印send_buf,在客户端中输入file_data,看看它们是否相同。还有一个建议,在从客户端的socket读取之前,在读取服务器中的文件之前使用memset(send_buf,0,BUFSIZE),以及memset(filedata,0,BUFSIZE)。