Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C读调用缓冲额外字符_C_Sockets_File Io - Fatal编程技术网

C读调用缓冲额外字符

C读调用缓冲额外字符,c,sockets,file-io,C,Sockets,File Io,我正在尝试读取文件并通过网络发送: 下面是我在服务器上读取和发送文件的代码 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) {

我正在尝试读取文件并通过网络发送: 下面是我在服务器上读取和发送文件的代码

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

垃圾字符是某种仲裁字符。你知道我为什么会有这样的性格吗


注意:我已经仔细检查了我的文件,它只有字符串“我的名字是abcd”。没有空间,没有新线。非常感谢您的帮助。

我建议您在服务器上打印发送内容,在客户端打印文件数据,看看它们是否相同。还有一个建议,在服务器中读取文件之前使用memset(send_buf,0,BUFSIZE),在客户端中从套接字读取文件之前使用memset(filedata,0,BUFSIZE)

我建议您在服务器上打印发送内容,在客户端打印文件数据,看看它们是否相同。还有一个建议,在服务器中读取文件之前使用memset(send_buf,0,BUFSIZE),在客户端中从套接字读取文件之前使用memset(filedata,0,BUFSIZE)

这里的解决方案很简单。使用您收到的数据的长度,而不是字符串的长度。您没有收到“字符串”。您收到的字节块可以是0到255之间的任意值。因此,
strlen
可能会返回无用的结果。但是读取的字节数总是准确的。

这里的解决方案很简单。使用您收到的数据的长度,而不是字符串的长度。您没有收到“字符串”。您收到的字节块可以是0到255之间的任意值。因此,
strlen
可能会返回无用的结果。但是读取的字节数总是准确的。

问题的实际原因是
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);
}
while((sent=read(fp,send_buf,BUFSIZE-1))>0)
{
如果(发送

它解决了这个问题。谢谢大家的帮助。

问题的实际原因是
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);
}
while((sent=read(fp,send_buf,BUFSIZE-1))>0)
{
如果(发送

它解决了这个问题。谢谢大家的帮助。

你多了哪个字符?多了一个字节。我不能把它粘贴在这里。下面是一个方框:77 0FI建议您在服务器上打印发送内容,在客户端打印文件数据,看看它们是否相同。还有一个建议,在服务器中读取文件之前使用memset(send_-buf,0,BUFSIZE),在客户端从socket读取文件之前使用memset(filedata,0,BUFSIZE)。
write(cssock,send_-buf,strlen(send_-buf)+1)发送空的ByteTanks yanchong。我在服务器上做了memset,但在客户端没有做。你能把这个作为答案吗?我来标记一下。你多了哪个字符?多了一个字节。我不能把它粘贴在这里。下面是一个方框:77 0FI建议您在服务器上打印发送内容,在客户端打印文件数据,看看它们是否相同。还有一个建议,在服务器中读取文件之前使用memset(send_-buf,0,BUFSIZE),在客户端从socket读取文件之前使用memset(filedata,0,BUFSIZE)。
write(cssock,send_-buf,strlen(send_-buf)+1)发送空的ByteTanks yanchong。我在服务器上做了memset,但在客户端没有做。你能把这个作为答案吗?我会标记它。它适用于小文件,但对于大文件,它仍然存在垃圾字符的问题。我已经解决了它,并将作为一个答案发布。它适用于小文件,但对于大文件,它仍然给出了垃圾字符的问题。我已经解决了它,并将作为一个答案张贴。