插座关闭后如何控制流量


//pseudo code - actual code in c++
Process P1 code:
func handle_close() {
print "close";
}
func sayhello() {
print "hello";
}
func writeonsocketforP2() {
write(fd, somedata, somedata_sz);
}
func WriteToP2() {
count = 0;
while (count++ != 1000000) writeonsocketforP2();
sayhello();
}

考虑以下场景:

  1. 进程P1(单线程(和P2之间建立的套接字连接
  2. 循环中的P1从WriteToP2函数向P2的套接字写入大量数据
  3. P2关闭,而P1仍在写入,并且P1调用了套接字关闭事件和关闭事件处理程序handle_close。。比方说这发生在计数为1000的时候
  4. 在调用handle_close之后,控制将返回while循环并从计数1001继续while循环吗
  5. 在WriteToP2中while循环的中间,套接字关闭后会调用sayhello((吗

这就是为什么您需要检查write()是否返回在套接字上写入的错误代码(假设面向连接的套接字类似于TCP(。如果在套接字上写入时发生错误(包括闭合的套接字(,则write()返回-1

此外,在您的代码中,直到循环结束,才会调用sayhello()。通常WriteToP2()需要另一个线程,除非您可以编写非阻塞代码。

最新更新