static void onNotify(struct Event* event, void* arg) { assert(event != NULL && arg != NULL); #ifdef DEBUG printf("on notify.\n"); #endif struct WorkerThread* thread = (struct WorkerThread*)arg; int tid = thread->tid; Server* server = thread->server; struct ConnQueue* queue = thread->queue; int efd = event->fd; uint64_t count; int nread = read(efd, &count, sizeof(count)); assert(nread == sizeof(count)); int sockfd = poll(queue); struct BufferEvent* bevent = newBufferEvent(event->loop, sockfd, server->onRead, server->onWrite, bevent); assert(bevent != NULL); enableRead(bevent); setTimer(bevent, 6000); if(server->afterAccept) server->afterAccept(bevent, NULL); }
bool TransportUDP::createIncoming(int port, bool is_server) { is_server_ = is_server; sock_ = socket(AF_INET, SOCK_DGRAM, 0); if (sock_ <= 0) { ROS_ERROR("socket() failed with error [%s]", last_socket_error_string()); return false; } server_address_.sin_family = AF_INET; server_address_.sin_port = htons(port); server_address_.sin_addr.s_addr = INADDR_ANY; if (bind(sock_, (sockaddr *)&server_address_, sizeof(server_address_)) < 0) { ROS_ERROR("bind() failed with error [%s]", last_socket_error_string()); return false; } socklen_t len = sizeof(server_address_); getsockname(sock_, (sockaddr *)&server_address_, &len); server_port_ = ntohs(server_address_.sin_port); ROSCPP_LOG_DEBUG("UDPROS server listening on port [%d]", server_port_); if (!initializeSocket()) { return false; } enableRead(); return true; }
bool TransportTCP::listen(int port, int backlog, const AcceptCallback& accept_cb) { is_server_ = true; accept_cb_ = accept_cb; sock_ = socket(AF_INET, SOCK_STREAM, 0); if (sock_ <= 0) { ROS_ERROR("socket() failed with error [%s]", last_socket_error_string()); return false; } server_address_.sin_family = AF_INET; server_address_.sin_port = htons(port); server_address_.sin_addr.s_addr = INADDR_ANY; if (bind(sock_, (sockaddr *)&server_address_, sizeof(server_address_)) < 0) { ROS_ERROR("bind() failed with error [%s]", last_socket_error_string()); return false; } ::listen(sock_, backlog); socklen_t len = sizeof(server_address_); getsockname(sock_, (sockaddr *)&server_address_, &len); server_port_ = ntohs(server_address_.sin_port); if (!initializeSocket()) { return false; } if (!(flags_ & SYNCHRONOUS)) { enableRead(); } return true; }
bool TransportTCP::listen(int port, int backlog, const AcceptCallback& accept_cb) { is_server_ = true; accept_cb_ = accept_cb; if (s_use_ipv6_) { sock_ = socket(AF_INET6, SOCK_STREAM, 0); sockaddr_in6 *address = (sockaddr_in6 *)&server_address_; address->sin6_family = AF_INET6; address->sin6_addr = isOnlyLocalhostAllowed() ? in6addr_loopback : in6addr_any; address->sin6_port = htons(port); sa_len_ = sizeof(sockaddr_in6); } else { sock_ = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in *address = (sockaddr_in *)&server_address_; address->sin_family = AF_INET; address->sin_addr.s_addr = isOnlyLocalhostAllowed() ? htonl(INADDR_LOOPBACK) : INADDR_ANY; address->sin_port = htons(port); sa_len_ = sizeof(sockaddr_in); } if (sock_ <= 0) { ROS_ERROR("socket() failed with error [%s]", last_socket_error_string()); return false; } if (bind(sock_, (sockaddr *)&server_address_, sa_len_) < 0) { ROS_ERROR("bind() failed with error [%s]", last_socket_error_string()); return false; } ::listen(sock_, backlog); getsockname(sock_, (sockaddr *)&server_address_, &sa_len_); switch (server_address_.ss_family) { case AF_INET: server_port_ = ntohs(((sockaddr_in *)&server_address_)->sin_port); break; case AF_INET6: server_port_ = ntohs(((sockaddr_in6 *)&server_address_)->sin6_port); break; } if (!initializeSocket()) { return false; } if (!(flags_ & SYNCHRONOUS)) { enableRead(); } return true; }