【问题标题】:linux C socket doesn't print within a looplinux C套接字不在循环内打印
【发布时间】:2013-12-09 09:31:56
【问题描述】:

我尝试用 C 语言制作一个简单的服务器。 它工作正常。当我添加一个循环来接收连接时, printf() 似乎不起作用。

listen(mysocket, 5); 
while (1) {
    consock = accept(mysocket, (struct sockaddr*)&client, &socksize);
    printf("incoming connection from %s \n", inet_ntoa(client.sin_addr));

    send(consock, message, strlen(message), 0);
    close(consock);      
}

close(mysocket);

如果我删除 while 循环,它会在 printf 函数中显示消息。有循环的地方没有打印出来。

请告诉我这是怎么发生的。我想我在这里遗漏了一些东西。

谢谢!

【问题讨论】:

  • 可能是缓冲问题,尤其是当您输出到某个文件或管道时。在 printf 之后尝试 fflush(stdout)。
  • 您应始终检查系统调用的结果是否有错误,并帮助您自己记录它们,例如使用perror()。至少在您显示的来源中相关的是:listen()accept()send()close()
  • @alk 感谢您的提示。
  • @alk 当然可以,但是在一些示例代码中省略错误检查是完全可以接受的。
  • 你关闭stdout了吗?或者以某种方式重定向它,例如调用daemon()

标签: c linux sockets unix networking


【解决方案1】:

尝试在 printf 之后添加fflush(stdout);

【讨论】:

  • 我添加了 fflush(stdout);但仍然没有打印。但是 send() 函数有效。我的客户收到消息。但是服务器仍然没有打印它。
  • stdout 至少是行缓冲的,因此 \n 执行隐式刷新。
  • 当我得到一个新终端时,我的原始代码可以工作。但是当请求隐藏时,stdout 似乎被击中了。我可以添加 sleep() 之类的吗?
【解决方案2】:

从 cmets 中的讨论到 OP,我得出结论,在某些条件下的代码中某处 close(1) 被调用,它关闭了 stdout

【讨论】:

    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多