我正在尝试用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 :(得分:1)
printf("%s", ...)
期望一个0-terninated字符串。
因此,您应该将0
附加到收到的缓冲区的末尾。
<强>更新强>
假设缓冲区定义如下:
char buffer[BUFFERLENGTH];
要向最后一个数组条目添加0
,请执行以下操作:
buffer[BUFFERLENGTH - 1] = 0;
一种更通用的方法(尽管成本更高)是在读入之前将整个接收缓冲区归零:
memset(buffer, 0, BUFFERLENGTH);
n = read (*newsockfd, buffer, BUFFERLENGTH - 1);
if (n < 0)
error ("ERROR reading from socket");
else
printf("buffer = %s\n", buffer);