客户端 - 服务器程序

时间:2009-04-22 18:24:15

标签: c

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

可以看到代码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);

3 个答案:

答案 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。