📄 agent.cc,v
字号:
head 1.1;access;symbols;locks; strict;comment @// @;1.1date 2002.07.02.19.27.57; author rbraud; state Exp;branches;next ;desc@@1.1log@Initial revision@text@/* * File: agent.cc * Author: Suman Banerjee <suman@@cs.umd.edu> * Date: 15th February, 2002 * Terms: GPL * * NICE Application Layer Multicast */#include <stdio.h>#include <stdlib.h>#include <assert.h>// #include <node.h>#include "agent.h"#include "timer.h"#include "app-packet.h"#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <unistd.h>#include <sys/time.h>#define STATE_SIZE 256#define MAX_RECV_BYTES 10000#define MAX_PAYLOAD 10000char rand_seq_state[STATE_SIZE];struct timeval start_time; float start_time_usec_float;Agent::Agent (int Id, int Index) { t = AGENT_NONE; id = Id; index = Index; // n = N; started = false; //n->a = this; FD_ZERO(&socket_set); num_sockets = 0; max_socket_fd = 0;}void Agent::init (int Id, int Index) { id = Id; index = Index; // n = N; started = false; FD_ZERO(&socket_set); num_sockets = 0; max_socket_fd = 0; // n->a = this; // memcpy(& agent_addr, &sa, sizeof(struct sockaddr_in)); /* memset( & udp_recv_agent_addr, 0, sizeof(struct sockaddr_in)); udp_recv_agent_addr.sin_family = AF_INET; // udp_recv_agent_addr.sin_addr.s_addr = htonl(INADDR_ANY); udp_recv_agent_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); udp_recv_agent_addr.sin_port = UDP_RECV_AGENT_PORT; */}void Agent::start (void) { // assert (! started); started = true; gettimeofday(& start_time, NULL); start_time_usec_float = ((float)start_time.tv_usec)/1000000.0; return;}void Agent::stop (void) { assert (started); started = false; assert(close(udp_sock) == 0); return;}void Agent::add_listening_fd(int fd, SOCKETHANDLER callback) { FD_SET(fd, &socket_set); // callback might be NULL, but that's ok. Just means we don't // want a callback for this fd. socket_map[fd] = callback; num_sockets++; if(fd > max_socket_fd) max_socket_fd = fd;}void Agent::remove_listening_fd(int fd) { FD_CLR(fd, &socket_set); socket_map.erase(fd); num_sockets--; if(fd == max_socket_fd) { // we need to compute the new max value SocketHandlerMap::const_iterator i; max_socket_fd = 0; for(i=socket_map.begin(); i!=socket_map.end(); i++) { if(i->first > max_socket_fd) max_socket_fd = i->first; } }}/*// flatten out the app packet into the payload and send it to dst_ag_addr. I tried to maintain the same byte ordering as defined in AppPacket.h void Agent::send_pkt (Packet *p, int dst_ag, struct sockaddr_in dst_ag_addr) { char payload[MAX_PAYLOAD]; AppPacket *ap = (AppPacket *) p; assert (dst_ag != id); assert (p); switch (p->t) { case (PACKET_APP) : int len = flatten_apppacket(payload, p, dst_ag); { int i; printf ("len %d\n", len); for (i=0; i < len; i++) printf ("%x\n", payload[i]); printf ("\n"); } if (sendto(udp_sock, payload, len, 0, (struct sockaddr *) & dst_ag_addr, sizeof(struct sockaddr_in)) != len) { printf("%s, %d, couldn't send msg properly\n", __FILE__, __LINE__); return; } }}*/void Agent::send_pkt (char * payload, int len, int dst_ag, struct sockaddr_in dst_ag_addr) { // char payload[MAX_PAYLOAD]; // AppPacket *ap = (AppPacket *) p; assert (dst_ag != id); // assert (p); //switch (p->t) { //case (PACKET_APP) : //int len = flatten_apppacket(payload, p, dst_ag); /* { int i; printf ("len %d\n", len); for (i=0; i < len; i++) printf ("%x\n", payload[i]); printf ("\n"); } */ dst_ag_addr.sin_family = AF_INET; if (sendto(udp_sock, payload, len, 0, (struct sockaddr *) & dst_ag_addr, sizeof(struct sockaddr_in)) != len) { perror("send"); printf("couldn't send msg properly with len = %d\n",len); printf(" host %s port %d\n",inet_ntoa(dst_ag_addr.sin_addr), ntohs(dst_ag_addr.sin_port)); // } } // else printf("send msg size is %d\n",len); return; }/*void Agent::generic_send_data_pkt (SourceDistributionType sdt, int burst_size, double burst_gap) { if (burst_size > 0) { specific_send_data_pkt(); if (burst_size == 1) return; AgentEvent * ag_e = new AgentEvent(AGENT_SOURCE); ag_e->sdt = sdt; ag_e->source_burst = burst_size - 1; ag_e->source_gap = burst_gap; EventInfo * sim_ev = new EventInfo(EVENT_AGENT,(void*)this,(void*)ag_e); double actual_gap; switch (sdt) { case DIST_CONSTANT: actual_gap = burst_gap; break; case DIST_UNIFORM: actual_gap = burst_gap * ( ((double)(get_pkt_source_random())) / ((double)RAND_MAX) ); break; default: assert(0); } Scheduler::AddRelativeEvent(actual_gap,sim_ev); } return;}*/void Agent::init_data_traffic_params(SourceDistributionType sdt, int burst_size, double burst_gap, long ticks_from_now) { data_traffic_params.t = AGENT_SOURCE; data_traffic_params.sdt = sdt; data_traffic_params.source_burst = burst_size; data_traffic_params.source_gap = burst_gap; assert(dt.a != NULL); dt.SetTimer(ticks_from_now); return; }void Agent::generic_send_data_pkt (char* payload, int data_len) { if (data_traffic_params.source_burst > 0) { specific_send_data_pkt(payload, data_len); if (data_traffic_params.source_burst == 1) return; data_traffic_params.source_burst --; double actual_gap; switch (data_traffic_params.sdt) { case DIST_CONSTANT: actual_gap = data_traffic_params.source_gap; break; case DIST_UNIFORM: actual_gap = data_traffic_params.source_gap * ( ((double)(get_pkt_source_random())) / ((double)RAND_MAX) ); break; default: assert(0); } // Scheduler::AddRelativeEvent(actual_gap,sim_ev); dt.SetTimer(actual_gap); } return;}void Agent::specific_send_data_pkt (char* payload, int data_len) { printf("in agent send data\n"); return;}int Agent::generic_rx_pkt_handler (Packet *p) { if (p->dst_agent != id) { /* Incorrect forwarding of the packet */ printf ("[Err] Packet %d incorrectly forwarded to < ag %d > correct is < ag %d > source is < ag %d > \n", p->id, id, p->dst_agent, p->src_agent); return -1; } /* Do app level packet handling here */ return specific_rx_pkt_handler(p);}int Agent::specific_rx_pkt_handler (Packet *p) { return 0;}void Agent::EventHandler (AgentEvent *ae) { switch (ae->t) { case AGENT_START : start (); /* send_pkt(new Packet,2,8); */ break; case AGENT_STOP : stop (); break; case AGENT_SOURCE : // generic_send_data_pkt(ae->sdt,ae->source_burst,ae->source_gap); break; default : printf ("[Err] Illegal agent event\n"); exit(-1); } delete ae; return;}void init_random_for_pkt_sources (unsigned int seed) { // char * old_state = initstate(seed,rand_seq_state,STATE_SIZE); // setstate(old_state); return;}long int get_pkt_source_random (void) { // char * old_state = setstate(rand_seq_state); // assert (old_state != NULL); long int ret_val = random(); // setstate(old_state); return ret_val;}void DataTimer::EventHandler(bool from_handle_expired_timers) { a->generic_send_data_pkt("testing", 7); return; }double my_clock() { struct timeval time1; gettimeofday(&time1, NULL); double d_time; d_time = (time1.tv_sec + (((float)time1.tv_usec) / 1000000.0)); d_time -= (start_time.tv_sec + start_time_usec_float); return d_time;}@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -