【发布时间】:2016-03-18 07:45:02
【问题描述】:
我有一个关于 TCP 连接中的非阻塞套接字的问题。
我已经实现了两个 c++ 类,一个用于 tcp 服务器,一个用于客户端。服务器有两个套接字文件描述符,一个用于服务器,一个用于客户端。客户端有一个套接字文件描述符。
我的服务器异步运行,我的客户端以固定速率运行。因此,我想要一个非阻塞套接字,用于将数据从客户端发送到服务器,s.t.客户端可以以固定的速率发送数据而不会停止,服务器异步读取同时缓存的所有数据。
所以我的问题是:如果我在客户端或服务器类中将客户端套接字设置为非阻塞,会有什么不同吗?(使用fcntl(this->newsockfd_, F_SETFL, fcntl(this->newsockfd_, F_GETFL, 0) | O_NONBLOCK),其中this->newsockfd_ 是两个类中客户端的套接字文件描述符)
我在我的程序中尝试过这个,似乎在客户端类中将客户端套接字设置为非阻塞并没有成功,但在服务器类中设置它可以。但是,我不明白为什么这会有所作为。
【问题讨论】:
-
有什么不同?将套接字设置为非阻塞意味着套接字读取、写入和其他套接字操作将立即返回。然后,您必须准备好处理没有数据传输的情况,因为操作通常会因为没有可读取的数据而阻塞,或者出站网络缓冲区已满等。