【问题标题】:Error in read and write client server programming读写客户端服务器编程出错
【发布时间】:2012-12-03 11:37:35
【问题描述】:

我正在 linux 中开发一个 c 程序。我需要使用客户端服务器编程。我使用了读写,它工作得很好。但是在服务器和客户端都使用了20多次读写之后,它就停止了工作。那就是我没有收到任何输出。线。我不明白问题出在哪里,因为我使用的是完全相同的行。

bzero(&hl,200);
read(a,hl,50*sizeof(char));
printf("%s",hl);

在客户端,

bzero(&hl,200);
strcpy(hl,"hello");
write(a,hl,50*sizeof(char));
printf("%s",hl);

另外,我无法获取返回值并打印它。当我在 debian 中使用它时,我得到了返回值并能够打印。现在,我在 Ubuntu(在家)。它现在不打印返回值。也没有错误!跟操作系统有关系吗?

请帮我解决问题。

更新:

在服务器中,

int c: s=read(a,&c,sizeof(int)); printf("选择:%d",c);

在客户端,

scanf("%d",&ch); s=write(sd,&ch,sizeof(int));

两者的大小都是 4。但是,在客户端打印选择时,我得到了垃圾值。

【问题讨论】:

    标签: client-server


    【解决方案1】:

    你扔掉了read的返回值,所以你不知道你读了多少字节。如果小于 50 怎么办?

    变化:

    read(a,hl,50*sizeof(char));
    

    收件人:

    int readBytes = 0;
    do
    {
        int r = read(a, hl + readBytes, 50 - readBytes);
        if (r <= 0)
            return; // or however you want to handle an error
        readBytes += r;
    } while (readBytes < 50);
    

    这将确保您实际读取 50 个字节。

    您正在想象 TCP 以某种方式将这 50 个字节“粘合”在一起。但是系统不知道这 50 个字节是一条消息——只有你的代码知道。因此,将它们重新粘合在一起是您的代码的工作。 TCP 不保留应用程序消息边界——这是应用程序的工作。

    【讨论】:

    • 在客户端。端得到 50 个字节,服务器 40 个。我现在应该做什么?
    • 修复服务器,使其再次调用read 以获取剩余的 10 个字节。没有什么可以将这 50 个字节“粘合”在一起——您的程序是唯一知道它们是消息的东西,因此您的程序的工作就是将它们粘合在一起。
    • 还是一样,先生。此外,我无法获取返回值并打印它。当我在 debian 中使用它时,我得到了返回值并能够打印。现在,我在 Ubuntu(在家)。它现在不打印返回值。跟操作系统有关系吗?
    • 粘贴不起作用的代码。当对方没有发送任何数据(或者你已经读完所有数据)时,你可能正在尝试读取数据。
    • 您必须在字节级别定义协议。你发送多少字节?第一个字节是什么意思?您不能只是将事物转换为指针并发送它们并期望它起作用。同样,您也无法检查来自read 的返回值,因此您再次不知道您读取了多少字节。同样,您期望 TCP 实现将这些字节“粘合”到接收端的消息中。 TCP 不这样做。那是你的工作。而你的代码没有做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2013-07-03
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多