- if(DP)
- dstream<<DPS<<"UDPSocket("<<(int)m_handle
- <<")::Bind(): port="<<port<<std::endl;
-
- sockaddr_in address;
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = INADDR_ANY;
- address.sin_port = htons(port);
-
- if(bind(m_handle, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
- {
-#ifndef DISABLE_ERRNO
- dstream<<(int)m_handle<<": Bind failed: "<<strerror(errno)<<std::endl;
-#endif
- throw SocketException("Failed to bind socket");
- }
+ if(socket_enable_debug_output) {
+ dstream << "UDPSocket(" << (int) m_handle << ")::Bind(): "
+ << addr.serializeString() << ":"
+ << addr.getPort() << std::endl;
+ }
+
+ if (addr.getFamily() != m_addr_family) {
+ static const char *errmsg = "Socket and bind address families do not match";
+ errorstream << "Bind failed: " << errmsg << std::endl;
+ throw SocketException(errmsg);
+ }
+
+ if(m_addr_family == AF_INET6) {
+ struct sockaddr_in6 address;
+ memset(&address, 0, sizeof(address));
+
+ address = addr.getAddress6();
+ address.sin6_family = AF_INET6;
+ address.sin6_port = htons(addr.getPort());
+
+ if(bind(m_handle, (const struct sockaddr *) &address,
+ sizeof(struct sockaddr_in6)) < 0) {
+ dstream << (int) m_handle << ": Bind failed: "
+ << strerror(errno) << std::endl;
+ throw SocketException("Failed to bind socket");
+ }
+ } else {
+ struct sockaddr_in address;
+ memset(&address, 0, sizeof(address));
+
+ address = addr.getAddress();
+ address.sin_family = AF_INET;
+ address.sin_port = htons(addr.getPort());
+
+ if (bind(m_handle, (const struct sockaddr *) &address,
+ sizeof(struct sockaddr_in)) < 0) {
+ dstream << (int)m_handle << ": Bind failed: "
+ << strerror(errno) << std::endl;
+ throw SocketException("Failed to bind socket");
+ }
+ }