gpt4 book ai didi

c - 如何突破fgets?

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:55 25 4
gpt4 key购买 nike

我正在编写一个简单的即时消息客户端和服务器来处理套接字编程。

我的客户有两个线程:

  • 线程 A 与服务器有流式套接字连接,并且在循环中执行 readline,打印出它接收到的文本行从服务器。如果 readline 返回 EOF,则循环退出。
  • 线程 B 在循环中使用 fgets 监听来自用户的键盘输入。当用户按下回车键时,它将行发送到服务器(因此它可以将其转发到其他客户端)。

当用户按下 Ctrl-D 时,客户端会向服务器发送一条特殊消息“客户端想要断开连接”,此时服务器会关闭该用户的连接文件描述符。这导致线程 A 退出循环,因为 readline 函数返回 EOF。线程 A 然后关闭连接文件描述符并完成。

与此同时,线程 B 仍在监听用户的键盘输入,直到他们按下回车键。理想情况下,fgets 会提前中断并让用户知道另一个客户端已断开连接。

无论如何我需要使用不同的输入函数或库吗?

最佳答案

首先,如果您正在尝试编写套接字函数,请不要使用 fgets() 或任何其他使用缓冲 IO 的东西,也称为 FILE *。而是使用文件描述符 (fd)。通常,应避免使用以“f”开头的每个 libc 函数。你想要

其次,您想阅读有关使用 select() 的异步 I/O,而不是研究如何“突破”fgets()

第三,我可以在这里给你一个教程,或者我可以告诉你去谷歌,或者看看http://en.wikipedia.org/wiki/Asynchronous_I/O但实际上你想要找到的是 Stephens 的副本(从内存中“Unix 环境中的高级编程”是你想要的,但实际上你应该购买所有它们并在你 sleep 时将它们贴在你的身上,希望通过渗透)。

第四,我知道你说过你想用线程来做这件事。如果你真的想这样做,你可以用 pthread_cancel() 杀死一个线程,然后重新启动它。不。正确地做。你不需要线程。

关于c - 如何突破fgets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com