2012-10-27 56 views
-1

我正在尝试在C中编写客户机/服务器程序以完成作业。应该发生的情况是: 连接成功 服务器等待客户端发送消息 客户端向用户询问消息,将其分配给字符串,然后将其发送到服务器。这是在客户端上的以下代码完成的:C:使用缓冲区从终端扫描输入

while(1){ 
/* prepare message */ 
    printf ("Please enter the message: "); 
    bzero (buffer, BUFFERLENGTH); //BUFFERLENGTH is defined as 256 
    fgets (buffer, BUFFERLENGTH, stdin); 
/* send message */ 
    n = write (sockfd, buffer, strlen(buffer)); 
    if (n < 0) 
     error ("ERROR writing to socket"); 
    bzero (buffer, BUFFERLENGTH); 
} 

现在,我的问题是,这段代码发送了一些乱码。据我所知,缓冲区没有被清空,或者并不总是BUFFERLENGTH长,所以随机垃圾正在从堆栈中读取?

服务器收到该消息并打印出来。如果客户端程序在"actual string I input"中扫描,那么服务器将输出类似于:

actual string I input @&^%~&虽然终端输出更充满了不可打印的字符,并且还有换行符。 代码服务器:

n = read (*newsockfd, buffer, BUFFERLENGTH -1); 
printf("buffer = %s\n",buffer); 
if (n < 0) 
    error ("ERROR reading from socket"); 

当我虽然移除while循环不会出现这种情况!

我读过关于bzero,我知道它已被弃用,我应该使用memset;但我试图这样做,与:memset(buffer,0,BUFFERLENGTH);和问题仍然发生。

任何解释为什么缓冲区附有乱码的原因?


编辑

缓冲器由声明在客户端:char buffer[BUFFERLENGTH]; '

+0

'写(的sockfd,缓冲,BufferLength中-1)'可能是解决你的问题的最直接(和效率低下)的方式。 – WhozCraig

+0

什么是缓冲区?一个指针?数组?你有没有malloc?放置缓冲区的声明 – texasbruce

+0

您确实在'n = read(* newsockfd,buffer,BUFFERLENGTH -1)之前放置了'memset(buffer,0,BUFFERLENGTH);''? – alk

回答

1

printf("%s", ...)期望的0 terninated字符串。

因此,您应该在收到的缓冲区末尾添加0

更新:

假设缓冲器的定义如下:

char buffer[BUFFERLENGTH]; 

要将0添加到最后一个阵列条目做像这样:

buffer[BUFFERLENGTH - 1] = 0; 

更通用方法(尽管成本更高)是z埃罗了整个接收缓冲区读取到它之前:

memset(buffer, 0, BUFFERLENGTH); 
n = read (*newsockfd, buffer, BUFFERLENGTH - 1); 
if (n < 0) 
    error ("ERROR reading from socket"); 
else 
    printf("buffer = %s\n", buffer); 
+0

用于在C中追加char *,我可以只执行'buffer = buffer +“0”;'? – benbenbenbenben

+0

@benbenbenbenben请回到阅读C教程,如果你有这样的问题。不,你不能,原因很明显。 – 2012-10-27 16:37:26

+0

耶道歉,我现在看到了。 – benbenbenbenben