PDA

View Full Version : نحوه بدست آوردن پورتهای پروتکل UDP



هم دانشگاهی
جمعه 05 مهر 1392, 20:18 عصر
سلام

چطوری میشه sourcie IP و پورتهایی که در کامپیوتر برای ارسال بسته های UDP مورد استفاده قرار میگره رو بدست آورد؟

ممنون

Felony
جمعه 05 مهر 1392, 21:44 عصر
GetExtendedUdpTable (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365930(v=vs.85).aspx)

هم دانشگاهی
جمعه 05 مهر 1392, 22:14 عصر
ممنون
ولی من خودم هم از این تابع استفاده کردم، ولی پورتهایی رو که نمایش میده با پورتهای دستور netstat -nao که از cmd قابل اجرا هست متفاوت هست:


PMIB_UDPTABLE_OWNER_PID pUdpTable;

pUdpTable = (PMIB_UDPTABLE_OWNER_PID ) malloc(sizeof(PMIB_UDPTABLE_OWNER_PID));

DWORD res = GetExtendedUdpTable(pUdpTable, &ulSize, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0);

printf("Enteries Number: %ld\n", pUdpTable->dwNumEntries);

for(int i=0; i<pUdpTable->dwNumEntries; i++)
{
printf("addr: %ld\n", pUdpTable->table[i].dwLocalAddr);
printf("Port: %ld\n", pUdpTable->table[i].dwLocalPort);
printf("Pid: %ld\n\n", pUdpTable->table[i].dwOwningPid);
}

ولی به نظر من درست کار نمیکنه، چون با پورتهای netstat -nao فرق میکنه!

ممنون میشم راهنمایی کنین

fjm11100
شنبه 06 مهر 1392, 22:09 عصر
اینو بگیر شاید کارت را راه بندازه

هم دانشگاهی
یک شنبه 07 مهر 1392, 08:31 صبح
ممنون

توی کد از کتابخونه precomp.h استفاده شده. چی هست؟ باید از کجا دانلودش کنم؟

fjm11100
یک شنبه 07 مهر 1392, 12:13 عصر
والا این توی سورسای عهد بوق توی کامپیوترمه میگردم اگه پیدا کردم میزارم. ولی میتونی کدش را ببینی که توش چیکار کرده این هدر هم احتمالا یکسری include دم دستیه

هم دانشگاهی
یک شنبه 07 مهر 1392, 18:11 عصر
با همون تابع GetExtendedUdPTable نمیشه پیداشون کرد؟
کد منو ببین، جاییش اشکال داره؟

fjm11100
یک شنبه 07 مهر 1392, 23:31 عصر
مقدار res بعد صدا زدن تابع چنده؟ باید NO_ERROR باشه

هم دانشگاهی
دوشنبه 08 مهر 1392, 04:48 صبح
آره NO_ERROR هست، ولی احساس میکنم خروجی اشتباهه. کد رو میزارم:


ULONG ulSize = 0;
DWORD dwRetVal = 0;
PMIB_UDPTABLE_OWNER_PID pUdpTable;

pUdpTable = (PMIB_UDPTABLE_OWNER_PID ) malloc(sizeof(PMIB_UDPTABLE_OWNER_PID));

DWORD res = GetExtendedUdpTable(pUdpTable, &ulSize, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0);

if(res == NO_ERROR)
{
printf("Enteries Number: %ld\n", pUdpTable->dwNumEntries);

for(int i=0; i<pUdpTable->dwNumEntries; i++)
{
printf("addr: %ld\n", pUdpTable->table[i].dwLocalAddr);
printf("Port: %ld\n", pUdpTable->table[i].dwLocalPort);
printf("Pid: %ld\n\n", pUdpTable->table[i].dwOwningPid);
}
}

fjm11100
دوشنبه 08 مهر 1392, 07:31 صبح
درست کار میکنه که! فقط آدرس ها را که حتما میدونی باید جدا کنی (IP4 میشه 4 تا بایت جدا جدا) و پورتها هم دو تا بایت جابجا میشن مثلا اگه پورت را نوشته 37905 باید بخونیش 4500 بایتهای بزرگ و کوچک جابجاست.
فقط یک سوال ulSize را صفر دادی ولی خطای 122 نمیده چطوری؟!

هم دانشگاهی
دوشنبه 08 مهر 1392, 09:48 صبح
منظورتو از اینکه گفتی IPv4 چهار بایت و Port دو بایت جابجا میشه رو نفهمیدم!

فک کنم اگه ulSiz رو کمتر از اندازه اصلی Table بدی خودش مقدار اصلی رو توش قرار میده.

fjm11100
دوشنبه 08 مهر 1392, 10:45 صبح
یعنی عدد آدرس را بایت بایت بایت جدا کنی که میشه مثلا 127.0.0.1
عدد پورت هم به دو بایت کم ارزش و پر ارزش تبدیل میشه که باید جای پر ارزش و کم ارزش را عوض کنی و مجدد به int تبدیلش کنی مثلا 37905 از دوبایت 10010100 و 00010001 تشکیل شده جاشو عوض کنی میشه 4500 که شماره پورت اونه.

هم دانشگاهی
دوشنبه 08 مهر 1392, 19:55 عصر
ممنون

حالا چه جوری میتونم بفهمم هر پکت ارسالی ( هم TCP و UDP ) از طریق کدوم نرم افزار ارسال شده؟

fjm11100
دوشنبه 08 مهر 1392, 23:02 عصر
از PID
اینو ببین http://stackoverflow.com/questions/4570174/how-to-get-process-name-in-c

هم دانشگاهی
دوشنبه 08 مهر 1392, 23:41 عصر
ممنون، ولی منظورم این بود که چه جوری بفهمیم یه پاکت متعلق به کدوم نرم افزاره ؟

برای یه پاکت فقط source port, dest port, source ip, desp ip رو داریم، از روی اینا اگه به Process ID برسیم بدست آوردن Process Name ساده میشه !

fjm11100
سه شنبه 09 مهر 1392, 08:55 صبح
منظورت را نفهمیدم. خب همین برنامه خودت داره میگه کدوم پورت مال کدوم PID است. توی پکت هم که پورت را داری مشکل چیه؟

هم دانشگاهی
سه شنبه 09 مهر 1392, 09:09 صبح
آره معذرت اشکال از طرف من بود،
این برنامه جدول پورتهایی که با پروتوکل UDP کار میکنند رو میده اما پکتهایی که در شبکه رد و بدل میشن رو نمیده. حالا تو یه برنامه دیگه این پکتها رو بدست آوردم ( TCP , UDP ) اما نمیدونم چه جوری این دو تا برنامه رو بهم ربط بدم، یعنی از اطلاعاتی که برای یک پاکت بدست آوردم و جدول پورتهای UDP و TCP متوجه بشم هر پاکت از طرف کدوم برنامه اومده و کدوم برنامه اونو فرستاده یا گرفته.

ممنون

fjm11100
سه شنبه 09 مهر 1392, 23:02 عصر
مگه پکت شماره پورت نداره؟ خب هر پورتی هم مال یک نرم افزاره یعنی یک برنامه داره گوشش میده. اینجوری سرورها پیدا میشن. اما کلاینت ها پیدا کردنشون به این راحتی نیست.

هم دانشگاهی
سه شنبه 09 مهر 1392, 23:12 عصر
واقعا ممنون،

کدوم پورت مورد نظرت هست؟ source port یا destination port ؟

یه سوال دیگه منظورت از سرورها و کلاینتها چین؟

fjm11100
سه شنبه 09 مهر 1392, 23:39 عصر
سرور نرم افزاریه که یک پورت را باز و به اون گوش میده تا یک کلاینت بهش وصل بشه و چیزی بده و بگیره. عموما پورت مبدا و مقصد یکیه اما بطور کلی اگه پکت دریافت شده توسط سرور باشه مقصد و اگر ارسال شده باشه پورت مبدا ملاکه