C(++)套接字fd_ *阻塞/延迟写/发送

时间:2015-02-05 22:44:22

标签: c++ c linux sockets


只要我不使用fd_set(..)/ select,我就可以接收和发送数据。 之后,我无法向客户端发送数据。数据发送""杀死进程(按ctrl C) 例如,如果我运行该片段:
http://www.binarytides.com/multiple-socket-connections-fdset-select-linux/ 我得到了#34;欢迎客户连接的消息" (第126行)但在下一个循环之后,通过fd_set添加新客户端并选择。第171行应该将收到的消息发送回客户端,但我只能在 之后将其取回
也许是因为运行服务器的操作系统"认为连接正忙并缓冲输出。这可能是杀死进程导致缓冲区被发送到客户端的原因。
如果我使用write()而不是send(),则行为不会改变。
 int count = write() 计数很好,代码不会抛出任何错误。
我在两个ubuntu 14.04系统上尝试过它(一个lts,另一个来自源代码) 如果您需要更多src代码,我会上传它。我只是认为链接中的示例有详细记录并显示问题 我已经找到了很多关于这个主题的内容,但我无法弄清楚我做错了什么,因为所有的教程和文档都是这样做的。

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

2 个答案:

答案 0 :(得分:1)

我怀疑你所看到的根本不是网络问题,而是你的程序的stdout流的缓冲问题。特别是,程序发送到stdout的字符实际上在终端窗口中变得不可见,直到(a)打印换行符(' \ n')或(b)您手动刷新流(例如vi fflush(stdout),或cout.flush(),或(c)程序终止(按CTRL-C时发生)。

所以很可能你的客户端程序确实收到并打印了这条消息,但是你没有看到它,因为程序在向终端打印之前正在等待换行符。 (在程序一次打印一行文本的情况下执行此操作是有意义的;但这可能令人困惑)

然后轻松修复(假设这确实是问题),就是调用fflush(stdout)(或printf(" \ n");在调用printf()打印接收到的文本之后。(或者,如果您使用C ++流,请在调用cout<< theText之后调用cout.flush()或cout<< endl)

答案 1 :(得分:0)

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