在ACE中,这个问题好像比较晦涩。

   我所遇到过的问题是在ACE_SOCK_Dgram_Bcast的第4个构造参数reuse_addr赋值为1,但很遗憾,在Windows平台上,就是不能使端口重用生效。使用setsockopt来强制服用端口,仍然无效;用ACE_SOCK_Dgram也试过了,同样无效。ACE的代码中如是说:

// If we are using winsock2 then the SO_REUSEADDR feature is broken
// SO_REUSEADDR=1 behaves like SO_REUSEPORT=1. (SO_REUSEPORT is an
// extension to sockets on some platforms)
// We define SO_REUSEPORT here so that ACE_OS::setsockopt() can still
// allow the user to specify that a socketaddr can *always* be reused.
                                                                               ——"config-win32-common.h"

   在Winsock2中不支持SO_REUSEADDR, 可是我要用的只是端口重用而已。

   不过ACE_SOCK_Dgram_Mcast倒是有效,可惜,不是一个概念。

   我后来用很不爽的办法才应付过去,用socket函数先创建好SOCKET句柄后,再用ACE_SOCK_Dgram::set_handle设置。挺郁闷的,不知道有没有好的方法能解决或解释。