【问题标题】:Why is my program not outputting anything with printf?为什么我的程序没有使用 printf 输出任何内容?
【发布时间】:2013-02-20 03:42:13
【问题描述】:

我是网络编程课的学生,我正在编写一个连接到三台服务器以进行文件传输的 UDP 客户端。到目前为止,我已经让客户端与前 2 台服务器进行通信,但是服务器的第 3 份副本无法正常工作。它甚至没有打印出我输入的 printf 调试语句。这是怎么回事? Unix有什么问题吗?前两台服务器与这台服务器完全相同,只是端口/IP地址发生了变化,它们工作得很好。

#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <strings.h>

int main(int argc, char**argv)
{
   printf("i will destroy you");
   int o = 1;
   int sockfd,n;
   struct sockaddr_in servaddr,cliaddr;
   socklen_t len;
   char mesg[1000];

   printf("im confused");
   sockfd=socket(AF_INET,SOCK_DGRAM,0);

   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
   servaddr.sin_port=htons(3454);
   bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
   printf("yo wtf");

   if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &o, sizeof(o)) < 0){
      perror("setsockopt failed");
      exit(0);
   }
   printf("here1");
   while(1)
   {
      len = sizeof(cliaddr);
      printf("here");
      n = recvfrom(sockfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&len);
      sendto(sockfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
      printf("-------------------------------------------------------\n");
      mesg[n] = 0;
      printf("Received the following:\n");
      printf("%s",mesg);
      printf("-------------------------------------------------------\n");
   }
}

【问题讨论】:

  • 首先,将\n 放在printf 字符串的末尾。您可能看不到它们,因为它们被缓冲了。
  • 如果要显示输出消息,请确保它们以换行符结尾。您的前两个 printf() 语句不以换行符结尾;在您输出换行符或使用fflush(stdout)(或在一行上打印太多数据以致它不再适合FILE * for stdout 的缓冲区)之后,它们的输出才会出现。
  • printf(3) 输出通常是缓冲的,只有当缓冲区(大)填满时才会写出。您可以使用fflush(stdout) 强制输出。

标签: c network-programming


【解决方案1】:

您可能需要更改,例如printf("i will destroy you")printf("i will destroy you\n")。或查看setbuf()。或者使用fflush(stdout)

【讨论】:

  • 现在可以打印了。为什么需要换行符?有时在我的其他程序中我将其省略,但它仍然显示在终端提示之前的某个位置。
  • scanf等使用stdin,绑定stdout,这样提示就不会乱码了。
  • 一个小问题:mesg[n] = 0; 这行不太对。 n 可能是 1000,因此 nul 被放在数组的末尾。 (或者,当然,n 可以是 -1,如果您想检查错误。)
  • 参见stackoverflow.com/q/2123528/318716,从标准输入读取是否刷新标准输出?但那里的答案似乎与我的评论不一致。
  • \n 总是保证刷新吗?
【解决方案2】:

你没有刷新stdout

或者,使用stderr

fprintf(stderr,"My message\n");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多