2012-12-03 38 views
0

我正在开发一个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(在家中)。现在不打印返回值。没有错误!这与OS有什么关系?

请帮我弄清楚问题所在。

更新:

在服务器,

INT C: S =读(一,& C,的sizeof(INT)); printf(“choice:%d”,c);

在客户端,

的scanf( “%d”,& CH); s = write(sd,& ch,sizeof(int));

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

回答

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不保存应用程序消息边界 - 这是应用程序的工作。

+0

在客户端。我得到50个字节和服务器40.我现在应该做什么? – Gomathi

+0

修复服务器,使其再次调用'read'以获得剩余的10个字节。没有什么能够将这50个字节粘合在一起 - 你的程序是唯一知道它们是消息的程序,所以你的程序的工作是将它们粘合在一起。 –

+0

先生,还是这样。此外,我无法获得返回值并打印出来。当我在debian中使用它时,我获得了返回值并能够打印。现在,在Ubuntu(在家中)。现在不打印返回值。这与OS有什么关系? – Gomathi

相关问题