void CEtherArpHandler::handle(CSmartPtr<CMsgQueue>& queue) { LOG_INFO_FMT("%s recv new msg ..., queue size = %lu", toString().c_str(), queue->size()); CSmartPtr<CMsg> msg; while (queue->try_pop(msg)) { INT4 sockfd = msg->getSockfd(); const CSmartPtr<CSwitch>& srcSw = CServer::getInstance()->getSwitchMgr()->findSwBySockFd(sockfd); // 获取packetin 信息 packet_in_info_t* packetIn = msg->getPacketIn(); arp_t* pkt = (arp_t*)packetIn->data; // 保存源主机信息 CHost* srcHost = CHostMgr::getInstance()->addHost(srcSw, 0, packetIn->inport, pkt->sendmac, pkt->sendip); // 查找目标主机 CHost* dstHost = CHostMgr::getInstance()->findHostByIp(pkt->targetip); // 如果源主机和目标主机都存在 if ((NULL != srcHost) && (NULL != dstHost)) { arp_t arp_pkt; // 如果是Arp Request if (isRequest(pkt)) { LOG_INFO("Create Arp Reply"); // 创建Arp Reply回应报文并且转发 create_arp_reply_pkt(&arp_pkt, srcHost, dstHost); forward(srcSw, srcHost->getPortNo(), sizeof(arp_pkt), &arp_pkt); } // 如果是Arp Reply if (isReply(pkt)) { LOG_INFO("forward Arp Reply"); // 转发Arp Reply回应报文 forward(dstHost->getSw(), dstHost->getPortNo(), sizeof(arp_pkt), &arp_pkt); } } // 如果不存在 else { LOG_INFO("flood Arp request"); // 将这个包广播 // flood(packetIn); } } }
/*! This property holds the message content. \par Access function: \li QString <b>content</b>() const */ QString IrcPrivateMessage::content() const { Q_D(const IrcMessage); QString msg = d->param(1); if (flags() & (Identified | Unidentified)) msg.remove(0, 1); const bool act = isAction(); const bool req = isRequest(); if (act) msg.remove(0, 8); if (req) msg.remove(0, 1); if (act || req) msg.chop(1); return msg; }
DCM_COMMAND_CLASS::DCM_COMMAND_CLASS(DIMSE_CMD_ENUM commandId) // DESCRIPTION : Constructor. // PRECONDITIONS : // POSTCONDITIONS : // EXCEPTIONS : // NOTES : //<<=========================================================================== { // constructor activities defineGroupLengthsM = true; commandIdM = commandId; isRequestM = isRequest(commandId); widTypeM = WAREHOUSE->dimse2widtype(commandId); return; }
Json::Value JsonRpcPrivate::handleObject(Json::Value const & jsonObject) { Json::Value response; if (!jsonObject.isObject()) { Json::Value const null; response = invalidRequest(null); } else { Json::Value const id(jsonObject["id"]); //TODO: handle special responses (e.g. parse errors) if (isRequest(jsonObject)) { response = handleRequest(jsonObject, id); } else if (isResponse(jsonObject)) { Json::Value const null; response = null; handleResponse(jsonObject, id); } else { response = invalidRequest(id); } } return response; }
bool BNetworkOperation::reply(int compressionLevel, const QVariant &variant) { if (isRequest()) return false; return connection()->sendReply(this, compressionLevel, variant); }
bool BNetworkOperation::reply(int compressionLevel, const QByteArray &data) { if (isRequest()) return false; return connection()->sendReply(this, compressionLevel, data); }
bool BNetworkOperation::reply(const QVariant &variant) { if (isRequest()) return false; return connection()->sendReply(this, variant); }
bool BNetworkOperation::reply(const QByteArray &data) { if (isRequest()) return false; return connection()->sendReply(this, data); }
bool isAck() { return isRequest() && (isSend() ? send_scheme->isAck() : !strcmp(recv_request, "ACK")); }
bool isCancel() { return isRequest() && (isSend() ? send_scheme->isCancel() : !strcmp(recv_request, "CANCEL")); }
bool Message::isResponse() const { return (!isEmpty() && !isRequest()); }
std::string SIPMessage::method() { if (!isRequest()) return ""; else return rline.substr(0, rline.find(" ")); }
int main(void) { struct pollfd sfd[3]; const long timeout=500; //connection timeout in seconds struct timespec ts_timeout; int size; field *pmessage; fldformat *frm; isomessage smessage; GOOGLE_PROTOBUF_VERIFY_VERSION; frm=loadNetFormat(); if(!frm) { printf("Error: Can't load format\n"); return 1; } printf("Message format loaded\n"); sfd[2].fd=tcpinit(); if(sfd[2].fd==-1) { printf("Error: Unable to start TCP connection\n"); freeFormat(frm); return 1; } sfd[0].fd=ipcopen((char *)"visa"); if(sfd[0].fd==-1) { printf("Error: Unable to connect to switch\n"); close(sfd[2].fd); freeFormat(frm); return 1; } if (signal(SIGINT, catch_sigint) == SIG_ERR) printf("Warning: unable to set the signal handler\n"); sfd[0].events=POLLIN; sfd[1].events=POLLIN; while (1) { printf("Waiting for a connection...\n"); errno=0; sfd[1].fd=tcpconnect(sfd[2].fd); if(sfd[1].fd==-1) { if(sigint_caught) { printf("onnection aborted^\n"); break; } printf("Connection error: %s\n", strerror(errno)); sleep(1); continue; } printf("Connected.\n"); while (1) { printf("Waiting for a message...\n"); ts_timeout.tv_sec=timeout; ts_timeout.tv_nsec=0; errno=0; size=ppoll(sfd, 2, &ts_timeout, NULL); //printf("poll: %d: %hd, %hd: %s\n", size, sfd[0].revents, sfd[1].revents, strerror(errno)); if(size==-1) { if(sigint_caught) { printf("losing connection^\n"); break; } printf("Error: poll (%hd, %hd): %s\n", sfd[0].revents, sfd[1].revents, strerror(errno)); if(sfd[1].revents) break; else { usleep(100000); continue; } } else if(size==0) { printf("Error: Connection is inactive, closing it %ld, %ld\n", ts_timeout.tv_sec, ts_timeout. tv_nsec); break; } if(sfd[1].revents & POLLIN) { printf("Receiving message from net\n"); size=tcprecvmsg(sfd[1].fd, &pmessage, frm); if(size==-1) { printf("Closing connection\n"); break; } else if(size==0) continue; print_message(pmessage); if(isNetMgmt(pmessage)) { if(isNetRequest(pmessage)) { if(!processNetMgmt(pmessage)) { printf("Error: Unable to process Network Management request. Message dropped.\n"); freeField(pmessage); continue; } print_message(pmessage); size=tcpsendmsg(sfd[1].fd, pmessage); if(size==-1) { printf("Closing connection\n"); freeField(pmessage); break; } else if(size==0) { freeField(pmessage); continue; } printf("Network Management Message sent (%d bytes)\n", size); } freeField(pmessage); continue; } if(translateNetToSwitch(&smessage, pmessage)!=0) { printf("Error: Unable to translate the message to format-independent representation.\n"); if(isNetRequest(pmessage)) { if(!declineNetMsg(pmessage)) { printf("Error: Unable to decline the request. Message dropped.\n"); freeField(pmessage); continue; } print_message(pmessage); size=tcpsendmsg(sfd[1].fd, pmessage); if(size==-1) { printf("Closing connection\n"); freeField(pmessage); break; } else if(size==0) { freeField(pmessage); continue; } printf("Decline message sent (%d bytes)\n", size); } freeField(pmessage); continue; } printf("Converted message:\n"); smessage.PrintDebugString(); size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch"); if(size<=0) { printf("Error: Unable to send the message to switch\n"); if(isNetRequest(pmessage)) { if(!declineNetMsg(pmessage)) { printf("Error: Unable to decline the request. Message dropped.\n"); freeField(pmessage); continue; } print_message(pmessage); size=tcpsendmsg(sfd[1].fd, pmessage); if(size==-1) { printf("Closing connection\n"); freeField(pmessage); break; } else if(size==0) { freeField(pmessage); continue; } printf("Decline message sent (%d bytes)\n", size); } freeField(pmessage); continue; } freeField(pmessage); printf("Message sent, size is %d bytes.\n", size); } if(sfd[0].revents & POLLIN) { printf("Receiving message from switch\n"); if(ipcrecvmsg(sfd[0].fd, &smessage)<0) continue; printf("\nOutgoingMessage:\n"); smessage.PrintDebugString(); pmessage=translateSwitchToNet(&smessage, frm); if(!pmessage) { printf("Error: Unable to translate the message from format-independent representation.\n"); if(isRequest(&smessage)) { if(!declineMsg(&smessage)) { printf("Error: Unable to decline the request. Message dropped.\n"); continue; } smessage.PrintDebugString(); size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch"); if(size<=0) { printf("Error: Unable to return the declined message to switch. Message dropped.\n"); continue; } printf("Decline message sent (%d bytes)\n", size); } continue; } print_message(pmessage); size=tcpsendmsg(sfd[1].fd, pmessage); freeField(pmessage); if(size==-1) { printf("Closing connection\n"); if(isRequest(&smessage)) { if(!declineMsg(&smessage)) { printf("Error: Unable to decline the request. Message dropped.\n"); continue; } smessage.PrintDebugString(); size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch"); if(size<=0) { printf("Error: Unable to return the declined message to switch. Message dropped.\n"); continue; } printf("Decline message sent (%d bytes)\n", size); } break; } else if(size==0) { if(isRequest(&smessage)) { if(!declineMsg(&smessage)) { printf("Error: Unable to decline the request. Message dropped.\n"); continue; } smessage.PrintDebugString(); size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch"); if(size<=0) { printf("Error: Unable to return the declined message to switch. Message dropped.\n"); continue; } printf("Decline message sent (%d bytes)\n", size); } continue; } printf("Message sent (%d bytes)\n", size); } } tcpclose(sfd[1].fd); printf("Disconnected.\n"); if(sigint_caught) break; } tcpclose(sfd[2].fd); ipcclose(sfd[0].fd); freeFormat(frm); google::protobuf::ShutdownProtobufLibrary(); return 0; }