آموزش جامع متغیر سیستمی @@PACK_SENT در SQL Server با ۱۰ مثال عملی
در بسیاری از اسکریپتهای مدیریتی، عدد یا نام خام بهتنهایی برای تصمیمگیری کافی نیست و باید به Metadata قابل فهم تبدیل شود. در این مقاله، @@PACK_SENT از سطح مقدماتی تا سناریوهای حرفهای بررسی میشود و هر مثال با خروجی نمونه ارائه شده است.
این مقدار برای بررسی روند کلی خروجی شبکه و مقایسه با @@PACK_RECEIVED در Snapshotهای دورهای استفاده میشود. تمرکز آموزش بر این است که @@PACK_SENT در چه Contextی اجرا شود، نتیجه آن چگونه تفسیر شود و چه زمانی باید از یک DMV یا کاتالوگویوی جایگزین کمک گرفت.
برای مشاهده جایگاه @@PACK_SENT میان سایر توابع و شمارندهها، راهنمای جامع توابع کمکی کارایی و Metadata در SQL Server را نیز مطالعه کنید.
تعریف و کاربرد اصلی @@PACK_SENT
متغیر @@PACK_SENT تعداد Packetهای شبکه نوشتهشده و ارسالشده توسط SQL Server از آخرین Startup را نشان میدهد. این تعریف در ظاهر کوتاه است، اما استفاده درست از @@PACK_SENT به درک مفاهیمی مانند network packets، sent و TDS وابسته است.
قاعده عملی @@PACK_SENT: ابتدا ورودی و Context را معتبر کنید، سپس خروجی را با نوع داده و معنای واقعی آن تفسیر کنید.
Syntax تابع یا متغیر @@PACK_SENT
SELECT @@PACK_SENT AS Result;
پارامترهای @@PACK_SENT
| پارامتر | توضیح |
|---|
| بدون پارامتر | شمارنده تجمعی Packetهای ارسالی Instance. |
نوع خروجی و رفتار NULL در @@PACK_SENT
integer تجمعی. در کد تولیدی بهتر است نوع مقصد بهصورت صریح تعیین شود؛ زیرا تبدیل ضمنی میتواند مقایسه، مرتبسازی یا ذخیره نتیجه @@PACK_SENT را مبهم کند.
مفاهیم کلیدی مرتبط با @@PACK_SENT
- network packets در مبحث @@PACK_SENT
- sent
- TDS در مبحث @@PACK_SENT
- cumulative counter در مبحث @@PACK_SENT
- result sets
- snapshot delta در مبحث @@PACK_SENT
- throughput در مبحث @@PACK_SENT
تصویر نخست، ارتباط @@PACK_SENT را با مفاهیم اختصاصی network packets، sent، TDS و cumulative counter نشان میدهد؛ این روابط مبنای انتخاب ورودی و تفسیر خروجی هستند.
سناریوهای واقعی استفاده از @@PACK_SENT
سناریوی 1 برای @@PACK_SENT، «Baseline خروجی شبکه» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 2 برای @@PACK_SENT، «مقایسه Send و Receive» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 3 برای @@PACK_SENT، «تشخیص گزارشهای حجیم» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 4 برای @@PACK_SENT، «پایش تغییر الگو» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
مثالهای عملی @@PACK_SENT از ساده تا حرفهای
مثال 1: خواندن مقدار پایه @@PACK_SENT
شمارنده Packetهای ارسالی را در لحظه فعلی میخوانیم. این سناریو بهطور اختصاصی برای درک رفتار @@PACK_SENT طراحی شده است.
SELECT @@PACK_SENT AS CurrentValue;
مقدار @@PACK_SENT تجمعی است و بهتنهایی نرخ مصرف را نشان نمیدهد. هنگام استفاده سازمانی از @@PACK_SENT، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 2: ثبت Snapshot زماندار @@PACK_SENT
مقدار Packetهای ارسالی را همراه زمان نمونهبرداری ثبت میکنیم. این سناریو بهطور اختصاصی برای درک رفتار @@PACK_SENT طراحی شده است.
SELECT @@PACK_SENT AS CounterValue,
SYSDATETIME() AS CapturedAt,
sqlserver_start_time
FROM sys.dm_os_sys_info;
| CounterValue | CapturedAt | sqlserver_start_time |
|---|
| 1769200 | 2026-07-25 00:45:00 | 2026-07-20 08:00:00 |
زمان Startup مشخص میکند Baseline از چه نقطهای آغاز شده است. هنگام استفاده سازمانی از @@PACK_SENT، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 3: محاسبه اختلاف دو نمونه @@PACK_SENT
برای Packetهای ارسالی دو Snapshot میگیریم و Delta را محاسبه میکنیم. این سناریو بهطور اختصاصی برای درک رفتار @@PACK_SENT طراحی شده است.
DECLARE @Before bigint = CONVERT(bigint, @@PACK_SENT);
WAITFOR DELAY '00:00:01';
DECLARE @After bigint = CONVERT(bigint, @@PACK_SENT);
SELECT @Before AS BeforeValue,
@After AS AfterValue,
@After - @Before AS DeltaValue;
| BeforeValue | AfterValue | DeltaValue |
|---|
| 1769200 | 1769418 | 218 |
Delta @@PACK_SENT برای بازه مشخص قابل تفسیرتر از مقدار مطلق است. هنگام استفاده سازمانی از @@PACK_SENT، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 4: ذخیره @@PACK_SENT در جدول موقت
برای پایش Packetهای ارسالی یک جدول Snapshot کوچک میسازیم. این سناریو بهطور اختصاصی برای درک رفتار @@PACK_SENT طراحی شده است.
CREATE TABLE #CounterSnapshot
(
CounterName sysname NOT NULL,
CounterValue bigint NOT NULL,
CapturedAt datetime2(3) NOT NULL
);
INSERT INTO #CounterSnapshot
VALUES (N'@@PACK_SENT', CONVERT(bigint, @@PACK_SENT), SYSDATETIME());
SELECT * FROM #CounterSnapshot;
| CounterName | CounterValue | CapturedAt |
|---|
| @@PACK_SENT | 1769200 | 2026-07-25 00:46:00.000 |
ذخیره تاریخچه امکان محاسبه نرخ و تشخیص تغییر Baseline را فراهم میکند. هنگام استفاده سازمانی از @@PACK_SENT، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
تصویر دوم، جریان اجرای @@PACK_SENT را از ورودی و اعتبارسنجی تا تولید خروجی نمایش میدهد و نشان میدهد که result sets در کدام مرحله باید کنترل شود.
ادامه مثالهای پیشرفته @@PACK_SENT
مثال 5: محاسبه نرخ @@PACK_SENT
Delta شمارنده Packetهای ارسالی را بر ثانیه تقسیم میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون @@PACK_SENT است.
DECLARE @StartValue bigint = CONVERT(bigint, @@PACK_SENT);
DECLARE @StartTime datetime2(3) = SYSDATETIME();
WAITFOR DELAY '00:00:02';
DECLARE @EndValue bigint = CONVERT(bigint, @@PACK_SENT);
DECLARE @Seconds decimal(18,3) =
DATEDIFF_BIG(millisecond, @StartTime, SYSDATETIME()) / 1000.0;
SELECT (@EndValue - @StartValue) / NULLIF(@Seconds, 0) AS EventsPerSecond;
نرخ @@PACK_SENT برای مقایسه بازههای هماندازه مناسبتر است. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از @@PACK_SENT جلوگیری میکند.
مثال 6: کنترل کاهش غیرمنتظره @@PACK_SENT
Restart یا Wraparound را با مقایسه دو مقدار تشخیص میدهیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون @@PACK_SENT است.
DECLARE @Previous bigint = 1769300;
DECLARE @Current bigint = CONVERT(bigint, @@PACK_SENT);
SELECT CASE
WHEN @Current < @Previous THEN N'Baseline بازنشانی یا شمارنده چرخیده است'
ELSE N'Delta معتبر است'
END AS CounterState;
| CounterState |
|---|
| Baseline بازنشانی یا شمارنده چرخیده است |
در صورت کاهش، Delta منفی را بهعنوان فعالیت واقعی ثبت نکنید. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از @@PACK_SENT جلوگیری میکند.
مثال 7: مدیریت بازه صفر برای @@PACK_SENT
در محاسبه نرخ Packetهای ارسالی از تقسیم بر صفر جلوگیری میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون @@PACK_SENT است.
DECLARE @Delta bigint = 218;
DECLARE @ElapsedSeconds decimal(18,3) = 0;
SELECT @Delta / NULLIF(@ElapsedSeconds, 0) AS SafeRate;
NULLIF خطای تقسیم بر صفر را حذف میکند و نیاز به Snapshot معتبر را نشان میدهد. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از @@PACK_SENT جلوگیری میکند.
مثال 8: مقایسه @@PACK_SENT با @@PACK_RECEIVED
برای تفسیر بهتر Packetهای ارسالی یک شاخص مکمل را کنار آن میآوریم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون @@PACK_SENT است.
SELECT CONVERT(bigint, @@PACK_SENT) AS PrimaryCounter,
CONVERT(bigint, @@PACK_RECEIVED) AS CompanionCounter,
SYSDATETIME() AS CapturedAt;
| PrimaryCounter | CompanionCounter | CapturedAt |
|---|
| 1769200 | 1285400 | 2026-07-25 00:47:00 |
همبستگی دو شمارنده فقط سرنخ است و علت قطعی Packetهای ارسالی را اثبات نمیکند. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از @@PACK_SENT جلوگیری میکند.
مثال 9: روش اشتباه در تفسیر @@PACK_SENT
بهجای قضاوت بر اساس عدد مطلق Packetهای ارسالی، Context زمانی را اضافه میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون @@PACK_SENT است.
SELECT CONVERT(bigint, @@PACK_SENT) AS AbsoluteValue,
DATEDIFF_BIG(second, sqlserver_start_time, SYSDATETIME()) AS UptimeSeconds
FROM sys.dm_os_sys_info;
| AbsoluteValue | UptimeSeconds |
|---|
| 1769200 | 414300 |
دو سرور با Uptime متفاوت را نباید فقط با مقدار تجمعی مقایسه کرد. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از @@PACK_SENT جلوگیری میکند.
مثال 10: Snapshot کمهزینه @@PACK_SENT
برای Packetهای ارسالی تنها ستونهای ضروری را در نمونهبرداری دورهای میخوانیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون @@PACK_SENT است.
SELECT
CONVERT(bigint, @@PACK_SENT) AS CounterValue,
sqlserver_start_time,
SYSUTCDATETIME() AS CapturedAtUtc
FROM sys.dm_os_sys_info;
| CounterValue | sqlserver_start_time | CapturedAtUtc |
|---|
| 1769200 | 2026-07-20 08:00:00 | 2026-07-24 21:18:00 |
Query سبک است، اما Frequency جمعآوری و نگهداری تاریخچه باید منطقی باشد. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از @@PACK_SENT جلوگیری میکند.
خطاهای رایج در کار با @@PACK_SENT
خطای 1 در استفاده از @@PACK_SENT
تعداد Packet معادل حجم بایت نیست. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه @@PACK_SENT را پیش از ادامه منطق با شرط صریح کنترل کنید.
خطای 2 در استفاده از @@PACK_SENT
Result Set بزرگ میتواند Packet زیاد ایجاد کند ولی علت را مشخص نمیکند. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه @@PACK_SENT را پیش از ادامه منطق با شرط صریح کنترل کنید.
خطای 3 در استفاده از @@PACK_SENT
برای یافتن Queryهای پرحجم، DMVها و ابزارهای Trace مناسبترند. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه @@PACK_SENT را پیش از ادامه منطق با شرط صریح کنترل کنید.
ملاحظات Performance برای @@PACK_SENT
از نظر کارایی، @@PACK_SENT زمانی کمهزینه باقی میماند که روی یک مقدار هدفمند یا مجموعه محدود اجرا شود. فراخوانی آن روی هزاران ردیف بدون Predicate اولیه میتواند CPU و زمان گزارش را افزایش دهد.
اگر گزارش به چند Property از چندین شیء نیاز دارد، استفاده Set-based از کاتالوگویو یا DMV مرتبط با network packets معمولاً بهتر از تکرار @@PACK_SENT برای هر سلول است.
در Jobهای دورهای، نتیجه @@PACK_SENT را همراه Timestamp ذخیره کنید، اما Frequency نمونهبرداری را متناسب با سرعت تغییر داده انتخاب کنید. جمعآوری بیش از حد، جدول تاریخچه را بدون ارزش تحلیلی بزرگ میکند.
برای محاسبات عددی پیرامون @@PACK_SENT، نوع داده را قبل از ضرب یا تفریق ارتقا دهید و در سناریوهای تجمعی، Restart و بازنشانی Baseline را در نظر بگیرید.
Best Practiceهای اختصاصی @@PACK_SENT
- ورودی @@PACK_SENT را از نام یا شناسه معتبر و دارای Schema یا Context روشن تأمین کنید.
- نتیجه NULL در @@PACK_SENT را از مقدار صفر، false یا رشته خالی جدا نگه دارید.
- نوع خروجی @@PACK_SENT را پیش از ذخیره یا مقایسه به نوع مقصد مناسب تبدیل کنید.
- در گزارشهای بزرگ، گزینه Set-based مرتبط با network packets را ارزیابی کنید. در مبحث @@PACK_SENT
- زمان Capture، نام Database و در صورت نیاز @@SPID را کنار نتیجه @@PACK_SENT ثبت کنید.
- مجوز مشاهده Metadata یا DMV را با حداقل سطح دسترسی لازم تنظیم کنید. در مبحث @@PACK_SENT
- مثالهای @@PACK_SENT را روی نسخه و Edition واقعی محیط هدف آزمایش کنید.
- برای SQL پویا، خروجی نامی @@PACK_SENT را با QUOTENAME و پارامترسازی ایمن مصرف کنید.
تصویر سوم، تفاوت روش پرخطر و Best Practice در استفاده از @@PACK_SENT را مقایسه میکند؛ هدف آن جلوگیری از خطاهای مربوط به تعداد Packet معادل حجم بایت نیست. و بهبود تصمیمگیری فنی است.
سؤالات متداول اختصاصی @@PACK_SENT
@@PACK_SENT دقیقاً چه مسئلهای را در SQL Server حل میکند؟
متغیر @@PACK_SENT تعداد Packetهای شبکه نوشتهشده و ارسالشده توسط SQL Server از آخرین Startup را نشان میدهد. در عمل، این مقدار برای بررسی روند کلی خروجی شبکه و مقایسه با @@PACK_RECEIVED در Snapshotهای دورهای استفاده میشود. بنابراین استفاده از @@PACK_SENT زمانی ارزشمند است که خروجی آن در یک تصمیم فنی روشن مصرف شود، نه اینکه فقط برای نمایش عدد یا نام به کار رود.
نوع خروجی @@PACK_SENT چیست و چگونه باید آن را مدیریت کرد؟
نوع خروجی این ابزار چنین است: integer تجمعی. بهتر است پیش از تبدیل نوع، مقایسه یا درج در جدول گزارش، حالت NULL و محدوده مقدار را صریح کنترل کنید تا رفتار @@PACK_SENT قابل پیشبینی بماند.
آیا @@PACK_SENT در گزارشهای سازمانی کاربرد تجاری دارد؟
بله. در سناریوهایی مانند Baseline خروجی شبکه و مقایسه Send و Receive، خروجی @@PACK_SENT میتواند کیفیت گزارش مدیریتی را بالا ببرد. ارزش تجاری زمانی ایجاد میشود که این داده به هشدار، ظرفیتسنجی یا کاهش زمان عیبیابی متصل شود.
استفاده از @@PACK_SENT در پروژههای بزرگ چه مزیتی دارد؟
در پروژه بزرگ، استانداردسازی نحوه استفاده از @@PACK_SENT باعث میشود تیم توسعه، DBA و پشتیبانی یک تعریف مشترک از network packets و sent داشته باشند. این هماهنگی خطاهای تفسیر و دوبارهکاری را کاهش میدهد.
تفاوت @@PACK_SENT با گزینه نزدیک آن چیست؟
@@PACK_SENT خروجی تجمعی را میدهد و @@PACK_RECEIVED ورودی تجمعی را. انتخاب صحیح باید بر اساس حجم داده، نیاز به خروجی Set-based و سطح جزئیات گزارش انجام شود؛ یک تابع scalar همیشه جایگزین کاتالوگویو یا DMV کامل نیست.
برای طراحی اسکریپت حرفهای مبتنی بر @@PACK_SENT چه خدماتی لازم میشود؟
در پروژههای حساس میتوان منطق @@PACK_SENT را در قالب رویه مانیتورینگ، Dashboard، گزارش زمانبندیشده یا کنترل Deployment پیاده کرد. تحلیل نیاز، تست روی نسخه واقعی SQL Server و مستندسازی خروجی، بخشهای مهم خدمات مشاوره و انجام پروژه هستند.
رایجترین خطا هنگام کار با @@PACK_SENT چیست؟
یکی از خطاهای مهم این است که تعداد Packet معادل حجم بایت نیست. همچنین نادیده گرفتن NULL یا Context اجرای Query میتواند نتیجهای ظاهراً معتبر ولی از نظر عملیاتی اشتباه تولید کند.
آیا فراخوانی زیاد @@PACK_SENT بر Performance اثر میگذارد؟
یک فراخوانی منفرد معمولاً سبک است، اما اجرای @@PACK_SENT روی مجموعه بسیار بزرگ یا در شرطی که برای هر ردیف محاسبه شود میتواند هزینه ایجاد کند. ابتدا ردیفها را محدود کنید و در گزارشهای وسیع، جایگزین Set-based را ارزیابی کنید.
بهترین روش استفاده از @@PACK_SENT چیست؟
بهترین روش این است که ورودی @@PACK_SENT اعتبارسنجی، نوع خروجی صریح، حالت NULL مدیریت و نتیجه همراه زمان و Context ثبت شود. همچنین باید مشخص باشد که خروجی برای نمایش، کنترل ایمنی یا تصمیم کارایی مصرف میشود.
@@PACK_SENT با کدام نسخههای SQL Server سازگار است؟
متغیر قدیمی و پایدار SQL Server است. با این حال، هنگام انتقال اسکریپت به Azure SQL یا Edition دیگر، Propertyها، مجوزهای Metadata و تفاوتهای پلتفرم را روی همان محیط آزمایش کنید. این توضیح بهطور اختصاصی به @@PACK_SENT مربوط است.
سؤالات مصاحبه درباره @@PACK_SENT
در مصاحبه چگونه تفاوت ورودی و خروجی @@PACK_SENT را توضیح میدهید؟
پاسخ مناسب باید Syntax یعنی @@PACK_SENT، نوع خروجی و شرایط NULL را توضیح دهد و یک نمونه از Baseline خروجی شبکه ارائه کند.
چه زمانی بهجای @@PACK_SENT از کاتالوگویو یا DMV استفاده میکنید؟
وقتی گزارش چندین ردیف و چند Property نیاز دارد، روش Set-based معمولاً مناسبتر است؛ @@PACK_SENT برای تبدیل یا بررسی هدفمند یک مقدار بسیار خواناست.
چگونه نتیجه نامعتبر @@PACK_SENT را از مقدار false یا صفر جدا میکنید؟
با بررسی صریح IS NULL، اعتبارسنجی ورودی و در صورت نیاز Join با Metadata منبع، علت نتیجه را روشن میکنم. این توضیح بهطور اختصاصی به @@PACK_SENT مربوط است.
چه نکته Performance درباره @@PACK_SENT مهم است؟
فراخوانی را پس از محدود کردن مجموعه داده انجام میدهم و از محاسبه تکراری @@PACK_SENT در SELECT و WHERE جلوگیری میکنم.
یک سناریوی واقعی برای @@PACK_SENT بیان کنید.
سناریوی مناسب میتواند تشخیص گزارشهای حجیم باشد؛ در آن خروجی همراه Timestamp، نام Database و شناسه نشست ثبت میشود تا قابل پیگیری باشد.
چکلیست نهایی استفاده از @@PACK_SENT
- Syntax @@PACK_SENT و ورودیهای آن با نسخه هدف تطبیق داده شده است.
- Context پایگاه داده یا Instance برای @@PACK_SENT روشن است.
- مجوز لازم برای Metadata یا DMV بررسی شده است. در مبحث @@PACK_SENT
- NULL، مقدار نامعتبر و حالت مرزی @@PACK_SENT تست شده است.
- نمونه خروجی با نوع داده واقعی مقایسه شده است. در مبحث @@PACK_SENT
- در Query بزرگ، هزینه فراخوانی تکراری @@PACK_SENT اندازهگیری شده است.
- جایگزین Set-based برای گزارش انبوه ارزیابی شده است. در مبحث @@PACK_SENT
- نتیجه نهایی همراه Timestamp و توضیح عملیاتی ثبت میشود. در مبحث @@PACK_SENT
جمعبندی آموزش @@PACK_SENT
@@PACK_SENT ابزاری کوچک اما مؤثر برای برای بررسی روند کلی خروجی شبکه و مقایسه با @@PACK_RECEIVED در Snapshotهای دورهای استفاده میشود. است. استفاده حرفهای از آن به اعتبارسنجی ورودی، تفسیر نوع خروجی، کنترل NULL و انتخاب Scope مناسب وابسته است.
پس از تسلط بر @@PACK_SENT، برای مقایسه آن با سایر ابزارهای این مجموعه به مقاله مادر توابع کمکی Performance و Metadata در SQL Server بازگردید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان
قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620
انجام پروژههای برنامهنویسی، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server با رویکرد حرفهای، مستند و قابل توسعه انجام میشود.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما