我们在UNIX环境中制作了简单的client.c
和server.c
程序。我们正在使用它传输一个简单的文本文件,首先打开它,然后阅读它并使用open
,read
和send
系统调用发送;在客户端我收到它,并通过在服务器机器上创建一个文件来编写它。传输过程非常顺利,但在客户端收到的文件在服务器端并不完全相同。在可读字符之间有一些不可读的字符。你能告诉我这可能是什么原因吗?虽然文件的大部分内容相同,但介于两者之间只有一小部分存在差异。
可以看到代码here。
谢谢!
服务器端循环:
do
{
n=read(t,buf,100);
write(1,buf,strlen(buf));
send(connected, buf,strlen(buf), 0);
} while(n!=0);
在客户端
do
{
bytes_recieved=recv(sock,recv_data,100,0);
count=write(t,recv_data,strlen(recv_data));
} while(bytes_recieved!=0);
答案 0 :(得分:1)
首先,请勿使用strlen()
。绝对不能保证文件流中的任何地方都会有一个NUL字节,事实上,文本文件永远都不应该存在。
每次循环时,你应该输出接收到的实际字节数,而不是strlen()
认为可能在缓冲区中的字节数:
do
{
bytes_received = recv(sock, recv_data, 100, 0);
if (bytes_received < 0) {
perror("read");
break;
} else if (bytes_received == 0) {
break;
} else {
count = write(t, recv_data, bytes_received);
// in theory - add error check here too!
}
} while (count > 0);
答案 1 :(得分:0)
你应该检查你的send()以查看它们是否成功。您可能会发现在某些时候写缓冲区(即套接字的输出缓冲区)已满,发送失败。这是正常行为。发送返回发送的字节数。如果您不发送多字节字符,这可能表现为缺少数据而不是数据。如果丢失一个双字节字符的一个字节,可能会导致损坏。
答案 2 :(得分:-2)
MS Windows系统使用回车换行作为行结尾,linux只使用换行符。
“不可读的字符”是Ctrl-M,回车符,字符编号13。