代码之家  ›  专栏  ›  技术社区  ›  mawia

客户机-服务器程序

c
  •  0
  • mawia  · 技术社区  · 17 年前

    我们已经简单化了 client.c 和 server.c 在UNIX环境中编程。我们使用它传输一个简单的文本文件,首先打开它,然后读取它并使用 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);
    
    3 回复  |  直到 17 年前
        1
  •  1
  •   Alnitak    17 年前

    首先,不要使用 strlen() . 绝对不能保证在文件流中的任何地方都会有一个NUL字节,事实上,对于文本文件,根本不应该有。

    每次循环时,您应该输出实际接收的字节数,而不是输出多少 斯特伦() 认为可能在缓冲区:

    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);
    
        2
  •  0
  •   Jonathan Adelson    17 年前

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

        3
  •  -2
  •   tpdi    17 年前

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

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