Skip to content

Commit 4541e21

Browse files
authored
Cleanup of WinPcapLiveDevice::sendPackets. (#1784)
- Changed raw pointer to use `std::unique_ptr`. - Changed raw dynamic array to use `std::vector`. - Simplified `send_queue_transmit` for readability.
1 parent 970d641 commit 4541e21

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

Pcap++/src/WinPcapLiveDevice.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
#include "TimespecTimeval.h"
66
#include "pcap.h"
77

8+
#include <memory>
9+
#include <vector>
10+
811
namespace 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

Comments
 (0)