55#include " TimespecTimeval.h"
66#include " pcap.h"
77
8+ #include < memory>
9+ #include < vector>
10+
811namespace pcpp
912{
1013
@@ -68,16 +71,26 @@ namespace pcpp
6871 for (int i = 0 ; i < arrLength; i++)
6972 dataSize += rawPacketsArr[i].getRawDataLen ();
7073
71- pcap_send_queue* sendQueue = pcap_sendqueue_alloc (dataSize + arrLength * sizeof (pcap_pkthdr));
74+ struct PcapSendQueueDeleter
75+ {
76+ void operator ()(pcap_send_queue* ptr) const noexcept
77+ {
78+ pcap_sendqueue_destroy (ptr);
79+ }
80+ };
81+
82+ auto sendQueue = std::unique_ptr<pcap_send_queue, PcapSendQueueDeleter>(
83+ pcap_sendqueue_alloc (dataSize + arrLength * sizeof (pcap_pkthdr)));
7284 PCPP_LOG_DEBUG (" Allocated send queue of size " << (dataSize + arrLength * sizeof (pcap_pkthdr)));
73- struct pcap_pkthdr * packetHeader = new struct pcap_pkthdr [arrLength];
85+
86+ std::vector<pcap_pkthdr> packetHeader (arrLength);
7487 for (int i = 0 ; i < arrLength; i++)
7588 {
7689 packetHeader[i].caplen = rawPacketsArr[i].getRawDataLen ();
7790 packetHeader[i].len = rawPacketsArr[i].getRawDataLen ();
7891 timespec packet_time = rawPacketsArr[i].getPacketTimeStamp ();
7992 TIMESPEC_TO_TIMEVAL (&packetHeader[i].ts , &packet_time);
80- if (pcap_sendqueue_queue (sendQueue, &packetHeader[i], rawPacketsArr[i].getRawData ()) == -1 )
93+ if (pcap_sendqueue_queue (sendQueue. get () , &packetHeader[i], rawPacketsArr[i].getRawData ()) == -1 )
8194 {
8295 PCPP_LOG_ERROR (" pcap_send_queue is too small for all packets. Sending only " << i << " packets" );
8396 break ;
@@ -87,8 +100,8 @@ namespace pcpp
87100
88101 PCPP_LOG_DEBUG (packetsSent << " packets were queued successfully" );
89102
90- int res;
91- if (( res = pcap_sendqueue_transmit (m_PcapDescriptor. get (), sendQueue, 0 )) < static_cast <int >(sendQueue->len ))
103+ int res = pcap_sendqueue_transmit (m_PcapDescriptor. get (), sendQueue. get (), 0 ) ;
104+ if (res < static_cast <int >(sendQueue->len ))
92105 {
93106 PCPP_LOG_ERROR (" An error occurred sending the packets: " << m_PcapDescriptor.getLastError () << " . Only "
94107 << res << " bytes were sent" );
@@ -107,10 +120,6 @@ namespace pcpp
107120 }
108121 PCPP_LOG_DEBUG (" Packets were sent successfully" );
109122
110- pcap_sendqueue_destroy (sendQueue);
111- PCPP_LOG_DEBUG (" Send queue destroyed" );
112-
113- delete[] packetHeader;
114123 return packetsSent;
115124 }
116125
0 commit comments