客户端 – 服务器程序

我们在UNIX环境中制作了简单的client.cserver.c程序。 我们正在使用它传输一个简单的文本文件,首先打开它,然后读取它并使用openreadsend系统调用send ; 在客户端我接收它,并通过在服务器机器上创建一个文件来编写它。 传输过程非常顺利,但在客户端收到的文件在服务器端并不完全相同。 在可读字符之间有一些不可读的字符。 你能告诉我这可能是什么原因吗? 虽然文件的大部分内容相同,但只有一小部分存在差异。

代码可以在这里看到。

谢谢!

服务器端循环:

 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); 

在第一个例子中,不要使用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); 

您应该检查send()以查看它们是否成功。 您可能会发现在某些时候写缓冲区(即套接字的输出缓冲区)已满,发送失败。 这是正常行为。 发送返回发送的字节数。 如果您不发送多字节字符,这可能表现为缺少数据而不是数据。 如果丢失一个双字节字符的字节,可能会导致损坏。

MS Windows系统使用回车换行作为行尾,linux使用换行符。

“不可读的字符”是Ctrl-M,回车符,字符号13。