-1

我正在尝试用 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]; `

4

1 回答 1

1

printf("%s", ...)需要一个以 0 结尾的字符串。

因此,您应该将 a 附加0到您收到的缓冲区的末尾。

更新:

假设缓冲区定义如下:

char buffer[BUFFERLENGTH];

要将 a 添加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);
于 2012-10-27T16:34:49.563 回答