A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
socket-options-ipv4.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* This program is free software; you can redistribute it and/or modify
4
* it under the terms of the GNU General Public License version 2 as
5
* published by the Free Software Foundation;
6
*
7
* This program is distributed in the hope that it will be useful,
8
* but WITHOUT ANY WARRANTY; without even the implied warranty of
9
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
* GNU General Public License for more details.
11
*
12
* You should have received a copy of the GNU General Public License
13
* along with this program; if not, write to the Free Software
14
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
*/
16
17
// Network topology
18
//
19
// n0 n1
20
// | |
21
// =================
22
// LAN
23
//
24
// - UDP flows from n0 to n1
25
26
#include <fstream>
27
#include "ns3/core-module.h"
28
#include "ns3/csma-module.h"
29
#include "ns3/applications-module.h"
30
#include "ns3/internet-module.h"
31
#include "ns3/network-module.h"
32
33
using namespace
ns3;
34
35
NS_LOG_COMPONENT_DEFINE
(
"SocketOptionsIpv4"
);
36
37
void
ReceivePacket
(
Ptr<Socket>
socket)
38
{
39
NS_LOG_INFO
(
"Received one packet!"
);
40
Ptr<Packet>
packet = socket->
Recv
();
41
SocketIpTosTag
tosTag;
42
if
(packet->
RemovePacketTag
(tosTag))
43
{
44
NS_LOG_INFO
(
" TOS = "
<< (uint32_t)tosTag.
GetTos
());
45
}
46
SocketIpTtlTag
ttlTag;
47
if
(packet->
RemovePacketTag
(ttlTag))
48
{
49
NS_LOG_INFO
(
" TTL = "
<< (uint32_t)ttlTag.
GetTtl
());
50
}
51
}
52
53
static
void
SendPacket
(
Ptr<Socket>
socket, uint32_t pktSize,
54
uint32_t pktCount,
Time
pktInterval )
55
{
56
if
(pktCount > 0)
57
{
58
socket->
Send
(Create<Packet> (pktSize));
59
Simulator::Schedule
(pktInterval, &
SendPacket
,
60
socket, pktSize,pktCount - 1, pktInterval);
61
}
62
else
63
{
64
socket->
Close
();
65
}
66
}
67
68
int
69
main
(
int
argc,
char
*argv[])
70
{
71
//
72
// Allow the user to override any of the defaults and the above Bind() at
73
// run-time, via command-line arguments
74
//
75
uint32_t packetSize = 1024;
76
uint32_t packetCount = 10;
77
double
packetInterval = 1.0;
78
79
//Socket options for IPv4, currently TOS, TTL, RECVTOS, and RECVTTL
80
uint32_t ipTos = 0;
81
bool
ipRecvTos =
true
;
82
uint32_t ipTtl = 0;
83
bool
ipRecvTtl =
true
;
84
85
CommandLine
cmd;
86
cmd.
AddValue
(
"PacketSize"
,
"Packet size in bytes"
, packetSize);
87
cmd.
AddValue
(
"PacketCount"
,
"Number of packets to send"
, packetCount);
88
cmd.
AddValue
(
"Interval"
,
"Interval between packets"
, packetInterval);
89
cmd.
AddValue
(
"IP_TOS"
,
"IP_TOS"
, ipTos);
90
cmd.
AddValue
(
"IP_RECVTOS"
,
"IP_RECVTOS"
, ipRecvTos);
91
cmd.
AddValue
(
"IP_TTL"
,
"IP_TTL"
, ipTtl);
92
cmd.
AddValue
(
"IP_RECVTTL"
,
"IP_RECVTTL"
, ipRecvTtl);
93
cmd.
Parse
(argc, argv);
94
95
NS_LOG_INFO
(
"Create nodes."
);
96
NodeContainer
n;
97
n.
Create
(2);
98
99
InternetStackHelper
internet;
100
internet.
Install
(n);
101
102
Address
serverAddress;
103
104
NS_LOG_INFO
(
"Create channels."
);
105
CsmaHelper
csma;
106
csma.
SetChannelAttribute
(
"DataRate"
,
DataRateValue
(
DataRate
(5000000)));
107
csma.
SetChannelAttribute
(
"Delay"
,
TimeValue
(MilliSeconds (2)));
108
csma.
SetDeviceAttribute
(
"Mtu"
,
UintegerValue
(1400));
109
NetDeviceContainer
d = csma.
Install
(n);
110
111
112
NS_LOG_INFO
(
"Assign IP Addresses."
);
113
Ipv4AddressHelper
ipv4;
114
ipv4.
SetBase
(
"10.1.1.0"
,
"255.255.255.0"
);
115
Ipv4InterfaceContainer
i = ipv4.
Assign
(d);
116
serverAddress =
Address
(i.
GetAddress
(1));
117
118
NS_LOG_INFO
(
"Create sockets."
);
119
//Receiver socket on n1
120
TypeId
tid =
TypeId::LookupByName
(
"ns3::UdpSocketFactory"
);
121
Ptr<Socket>
recvSink =
Socket::CreateSocket
(n.
Get
(1), tid);
122
InetSocketAddress
local =
InetSocketAddress
(
Ipv4Address::GetAny
(), 4477);
123
recvSink->
SetIpRecvTos
(ipRecvTos);
124
recvSink->
SetIpRecvTtl
(ipRecvTtl);
125
recvSink->
Bind
(local);
126
recvSink->
SetRecvCallback
(
MakeCallback
(&
ReceivePacket
));
127
128
//Sender socket on n0
129
Ptr<Socket>
source =
Socket::CreateSocket
(n.
Get
(0), tid);
130
InetSocketAddress
remote =
InetSocketAddress
(i.
GetAddress
(1), 4477);
131
132
//Set socket options, it is also possible to set the options after the socket has been created/connected.
133
if
(ipTos > 0)
134
{
135
source->
SetIpTos
(ipTos);
136
}
137
138
if
(ipTtl > 0)
139
{
140
source->
SetIpTtl
(ipTtl);
141
}
142
source->
Connect
(remote);
143
144
AsciiTraceHelper
ascii;
145
csma.
EnableAsciiAll
(ascii.
CreateFileStream
(
"socket-options-ipv4.tr"
));
146
csma.
EnablePcapAll
(
"socket-options-ipv4"
,
false
);
147
148
//Schedule SendPacket
149
Time
interPacketInterval = Seconds (packetInterval);
150
Simulator::ScheduleWithContext
(source->
GetNode
()->
GetId
(),
151
Seconds (1.0), &
SendPacket
,
152
source, packetSize, packetCount, interPacketInterval);
153
154
NS_LOG_INFO
(
"Run Simulation."
);
155
Simulator::Run
();
156
Simulator::Destroy
();
157
NS_LOG_INFO
(
"Done."
);
158
}
examples
socket
socket-options-ipv4.cc
Generated on Fri Aug 30 2013 01:42:44 for ns-3 by
1.8.1.2