A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
udp-client.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007,2008,2009 INRIA, UDCAST
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Amine Ismail <amine.ismail@sophia.inria.fr>
19  * <amine.ismail@udcast.com>
20  */
21 #include "ns3/log.h"
22 #include "ns3/ipv4-address.h"
23 #include "ns3/nstime.h"
24 #include "ns3/inet-socket-address.h"
25 #include "ns3/inet6-socket-address.h"
26 #include "ns3/socket.h"
27 #include "ns3/simulator.h"
28 #include "ns3/socket-factory.h"
29 #include "ns3/packet.h"
30 #include "ns3/uinteger.h"
31 #include "udp-client.h"
32 #include "seq-ts-header.h"
33 #include <stdlib.h>
34 #include <stdio.h>
35 
36 namespace ns3 {
37 
38 NS_LOG_COMPONENT_DEFINE ("UdpClient");
39 NS_OBJECT_ENSURE_REGISTERED (UdpClient);
40 
41 TypeId
43 {
44  static TypeId tid = TypeId ("ns3::UdpClient")
46  .AddConstructor<UdpClient> ()
47  .AddAttribute ("MaxPackets",
48  "The maximum number of packets the application will send",
49  UintegerValue (100),
50  MakeUintegerAccessor (&UdpClient::m_count),
51  MakeUintegerChecker<uint32_t> ())
52  .AddAttribute ("Interval",
53  "The time to wait between packets", TimeValue (Seconds (1.0)),
54  MakeTimeAccessor (&UdpClient::m_interval),
55  MakeTimeChecker ())
56  .AddAttribute (
57  "RemoteAddress",
58  "The destination Address of the outbound packets",
59  AddressValue (),
60  MakeAddressAccessor (&UdpClient::m_peerAddress),
61  MakeAddressChecker ())
62  .AddAttribute ("RemotePort", "The destination port of the outbound packets",
63  UintegerValue (100),
64  MakeUintegerAccessor (&UdpClient::m_peerPort),
65  MakeUintegerChecker<uint16_t> ())
66  .AddAttribute ("PacketSize",
67  "Size of packets generated. The minimum packet size is 12 bytes which is the size of the header carrying the sequence number and the time stamp.",
68  UintegerValue (1024),
69  MakeUintegerAccessor (&UdpClient::m_size),
70  MakeUintegerChecker<uint32_t> (12,1500))
71  ;
72  return tid;
73 }
74 
76 {
78  m_sent = 0;
79  m_socket = 0;
80  m_sendEvent = EventId ();
81 }
82 
84 {
86 }
87 
88 void
90 {
91  m_peerAddress = Address(ip);
92  m_peerPort = port;
93 }
94 
95 void
97 {
98  m_peerAddress = Address(ip);
99  m_peerPort = port;
100 }
101 
102 void
104 {
105  m_peerAddress = ip;
106  m_peerPort = port;
107 }
108 
109 void
111 {
114 }
115 
116 void
118 {
120 
121  if (m_socket == 0)
122  {
123  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
126  {
127  m_socket->Bind ();
129  }
130  else if (Ipv6Address::IsMatchingType(m_peerAddress) == true)
131  {
132  m_socket->Bind6 ();
134  }
135  }
136 
139 }
140 
141 void
143 {
146 }
147 
148 void
150 {
153  SeqTsHeader seqTs;
154  seqTs.SetSeq (m_sent);
155  Ptr<Packet> p = Create<Packet> (m_size-(8+4)); // 8+4 : the size of the seqTs header
156  p->AddHeader (seqTs);
157 
158  std::stringstream peerAddressStringStream;
160  {
161  peerAddressStringStream << Ipv4Address::ConvertFrom (m_peerAddress);
162  }
164  {
165  peerAddressStringStream << Ipv6Address::ConvertFrom (m_peerAddress);
166  }
167 
168  if ((m_socket->Send (p)) >= 0)
169  {
170  ++m_sent;
171  NS_LOG_INFO ("TraceDelay TX " << m_size << " bytes to "
172  << peerAddressStringStream.str () << " Uid: "
173  << p->GetUid () << " Time: "
174  << (Simulator::Now ()).GetSeconds ());
175 
176  }
177  else
178  {
179  NS_LOG_INFO ("Error while sending " << m_size << " bytes to "
180  << peerAddressStringStream.str ());
181  }
182 
183  if (m_sent < m_count)
184  {
186  }
187 }
188 
189 } // Namespace ns3