【问题标题】:C(++) Sockets fd_* is blocking/delaying write/sendC(++) Sockets fd_* 阻塞/延迟写入/发送
【发布时间】:2023-03-17 18:55:01
【问题描述】:


只要不使用 fd_set(..) /select,我就可以接收和发送数据。 之后我无法向客户端发送数据。数据“在”终止进程后发送(按 ctrl C)。
例如,如果我运行 sn-p:
http://www.binarytides.com/multiple-socket-connections-fdset-select-linux/ 我收到“欢迎客户端连接消息”(第 126 行),但在下一个循环之后,新客户端通过 fd_set 和 select 添加。第 171 行应该将收到的消息发送回客户端,但我只有在 终止进程后才能将其取回。
可能是因为“运行服务器的操作系统”认为连接繁忙并缓冲输出。这可能是杀死进程导致缓冲区被发送到客户端的原因。
如果我使用 write() 而不是 send() 行为不会改变。
整数计数 = 写入() 计数很好,代码不会抛出任何错误。
我在两个 ubuntu 14.04 系统(一个 lts 和其他一些从源代码构建)上尝试过它
如果您需要更多的 src 代码,我会上传它。我只是认为链接中的示例有据可查并显示了问题。
我已经找到了很多关于这个主题的东西,但是我不知道我做错了什么,因为所有的教程和文档都是这样做的。

不幸的是,我对 c++/linux 不太熟悉,也不知道接下来要研究什么。所以任何帮助表示赞赏。
谢谢:)

【问题讨论】:

  • 你是如何测试的?您如何确定何时发送数据?很可能,问题出在另一端,直到连接关闭才检查数据。
  • 你为什么要标记这个 C++。链接的源代码看起来像普通的 C。
  • David Schwartz:如果我不使用 fd_*,通信就可以正常工作。例如,如果我不使用普通的 read() 和 write 方法,我可以发送和接收数据。 (客户端明白了)
    alk:你说得对,我贴的例子是纯c

标签: c++ c linux sockets


【解决方案1】:

我怀疑您所看到的根本不是网络问题,而是您程序的标准输出流的缓冲问题。特别是,在 (a) 打印换行符 ('\n') 或 (b) 您手动刷新流(例如 vi fflush( stdout),或 cout.flush(),或 (c) 程序终止(当您按下 CTRL-C 时会发生这种情况)。

所以很可能您的客户端程序确实接收并打印了消息,但您没有看到它,因为程序在向终端打印任何内容之前正在等待换行符。 (在程序一次打印出一行文本一个小的子字符串的情况下这样做是有意义的;但这可能会造成混淆)

那么简单的解决方法(假设这确实是问题),将是调用 fflush(stdout) (或 printf("\n"); 在你调用 printf() 来打印接收到的文本之后。(或者如果你正在使用 C++ 流,在调用 cout 之后调用 cout.flush() 或 cout

【讨论】:

  • 如果我使用简单的 read() 和 write() 方法,我的客户端是用 java 编写的,并且已经适用于 (java java) 或 (c java)。
【解决方案2】:

找到错误,感谢提到客户的 Jeremy Friesner。我一直读到“\n”出现 -> 解析消息。为了测试我的 c++ 服务器,我发送了没有“\n”的消息。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多