+ std::list<SocketsElement>::iterator it = sockets_.begin();
+ for(;it != sockets_.end(); ++it) {
+/// this might be a needed by the receiver thread, TODO cleanup
+// delete[](it->buf_);
+// delete(it->sem_);
+// delete(it->sock_);
+ }
+}
+
+void UDPPacketSource::onResolve(PacketSourceResolverIt& it)
+{
+ while(it != PacketSourceResolverIt()) {
+ PacketSourceEndpoint e = *it;
+ cLog.msg(Log::PRIO_NOTICE) << "opening socket: " << e;
+
+ SocketsElement sock;
+ sock.buf_ = NULL;
+ sock.len_ = 0;
+ sock.sem_ = NULL;
+ sock.sock_ = new proto::socket(io_service_);
+ if(!sock.sock_)
+ AnytunError::throwErr() << "memory error";
+
+ sock.sock_->open(e.protocol());
+#ifndef _MSC_VER
+ if(e.protocol() == proto::v6())
+ sock.sock_->set_option(boost::asio::ip::v6_only(true));
+#endif
+ sock.sock_->bind(e);
+ sockets_.push_back(sock);
+
+ it++;
+ }
+
+ // prepare multi-socket recv
+ if(sockets_.size() > 1) {
+ std::list<SocketsElement>::iterator it = sockets_.begin();
+ for(;it != sockets_.end(); ++it) {
+ it->len_ = MAX_PACKET_LENGTH;
+ it->buf_ = new u_int8_t[it->len_];
+ if(!it->buf_)
+ AnytunError::throwErr() << "memory error";
+
+ it->sem_ = new Semaphore();
+ if(!it->sem_) {
+ delete[](it->buf_);
+ AnytunError::throwErr() << "memory error";
+ }
+
+ boost::thread(boost::bind(&UDPPacketSource::recv_thread, this, it));
+ it->sem_->up();
+ }
+
+ }
+