PDA

View Full Version : مشکل در برنامه client & server



amir44
دوشنبه 24 مرداد 1390, 21:11 عصر
سلام بچه ها.
راستش من تازه کارم و تازه یه هفته میشه که پی اچ پی رو شروع کردم.من یه برنامه با ویبی نوشتم که میاد رو سیستم خودم روی پورت خاصی گوش به زنگ میمونه و اطلاعات رو از پورت مشخصی دریافت میکنه که البته توی این قسمت مشکلی ندارم. مشکل من بخش فرستنده هست که میخوام با پی اچ پی بنویستم و میخوام زمانی که صفحه پی اچ پی ران شد. یه داده ای رو به اون سیستمم روی پورت مشخص شده بفرستم تا اونم دریافت کنه و کارای لازم رو انجام بده. سورس بخش فرستنده رو اینجوری نوشتم اما هرکاری میکنم به اون آی پی و پورت مشخص شده کانکت نمیشه.مثلا فرض کنیم ای پی من 66.66.111.111 باشه.


<?php

$buff='hello';

$res=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($res,'65.65.111.111',12345);

socket_send($res,$buff,5,MSG_OOB);

socket_close($res);


?>


ممنون میشم اگه کمکم کنید.

sezavar01
دوشنبه 24 مرداد 1390, 21:31 عصر
salam
bbakhshid miporsam
mishe bfarmayid shoma baraye yadgiri php az ch manabei estefade kardid
chon manam taze kar k nmishe goft mobtadiam

eshpilen
دوشنبه 24 مرداد 1390, 21:52 عصر
شانس آوردی یکی اینجا هست که قبلا در این زمینه کار کرده و اطلاعاتی داره!

فکر میکنم مشکل شما از اونجا ناشی میشه که ارتباط با یک سیستم که پشت NAT هست به این شکل امکان نداره. حتی اگر پشت NAT هم نباشی از طریق بعضی ISP ها شروع ارتباط TCP از خارج به کلاینت هاشون ممکن نیست (حالا علتش دقیقا چیه نمیدونم). اون سیستم شما از چه طریقی به اینترنت ارتباط داره؟ اگر ADSL هست، طرز کار مودم رو از حالت PPPoE به Bridge تغییر بدید و ببینید شاید مشکل حل بشه (بستگی به ISP شما هم داره)، چون PPPoE باعث کار کردن مودم بصورت NAT میشه. اگر از دایالاپ استفاده میشه، بازهم عوض کردن ISP میتونه این مشکل رو حل کنه، ولی مسلما عوض کردن ISP یک روش غیراصولی و محدود و غیرقابل اعتماده.

خوشبختانه راه حلی کلی ای هم در این موارد وجود داره، ولی پیچیده هست و کار میبره. یه ترفندی داره بنام Port punching که از UDP استفاده میکنه.
نمونه ای اون راه حل رو میتونید در این تاپیک (http://barnamenevis.org/showthread.php?271364-%D9%BE%D8%B1%D9%88%DA%98%D9%87%D8%A1-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-P2P) مشاهده کنید.
اگر از این راه حل استفاده کنید، تازه بعد از Port punching نیاز دارید تا انتقال از طریق UDP رو مدیریت کنید، چون در UDP نظارت بر دریافت صحیح دیتا در طرف دیگه رو خود برنامه ها باید انجام بدن. چون Packet های UDP که ارسال میشن ممکنه به مقصد نرسن، و ترتیب صحیح دریافت اونها هم تضمین نشده، و گاهی حتی ممکنه یکی ارسال کنید ولی بیش از یکی از یک Packet یکسان به مقصد برسه.


یه داده ای رو به اون سیستمم روی پورت مشخص شده بفرستم تا اونم دریافت کنه و کارای لازم رو انجام بده.میدونم شاید سوال احمقانه ای باشه، اما روی اون سیستم هم برنامه ای روی پورت مشخص شده مشغول گوش دادن هست دیگه؟

eshpilen
دوشنبه 24 مرداد 1390, 22:06 عصر
یه کار دیگه هم میتونید بکنید و اون اینکه اون سیستم باید مثلا در فواصل زمانی خاصی با سرور شما تماس بگیره (البته اگر سرور شما یک IP ولید داره، وگرنه ممکنه به مشکل مشابهی برخورد کنه) یا از طریق استفاده از یک سرور واسطه در اینترنت میتونید دو سیستم رو بهم ارتباط بدید. یعنی سیستمهای کلاینت باید با سیستمی تماس بگیرن که در اینترنت یا شبکه IP معتبر/قابل دسترسی داره. یعنی همیشه کلاینت های معمولی هستن که باید آغازگر یک ارتباط TCP باشن. شکل عکس، یعنی اینکه سیستم دیگری از خارج با یک کلاینت معمولی تماس بگیره (آغازگر ارتباط باشه)، محدودیت ها و مشکلاتی رو که گفتم داره.

amir44
دوشنبه 24 مرداد 1390, 22:17 عصر
جناب eshpilen ممنون از راهنماییت:لبخندساده: اون روش که از پروتکول udp استفاده میکنه و امتحان میکنم و نتیجه اش رو میگم-الانم میرم طبق فرمایشات شما مودمم رو رو حالت bridge میزارم -نتیجه اش رو میام اینجا میگم-امیدوارم که درست بشه.
بله درسته- سیستم من مشغول گوش دادن هست.

در رابطه با سوال آقای sezavar01 هم باید عرض کنم من از آموزش های رسمی در سایت php.net استفاده کردم .

amir44
دوشنبه 24 مرداد 1390, 22:32 عصر
راستی بر فرض هم اگر اون حالت bridge جواب بده متاسفانه به کار من نمیاد-:ناراحت:چون قراره من برنامه ام رو به دیگران هم بدم و برای همین نمیشه کاربران رو مجبور کرد که مودمشون رو bridge mod کنه.:ناراحت:

eshpilen
دوشنبه 24 مرداد 1390, 23:37 عصر
آره دیگه گفتم که اون راهکارها غیراصولی و غیرقابل اعتماد و محدودکننده هستن. برنامه باید در هر شرایطی کار کنه. اگر بطور مطلق نمیشه، باید در حداکثر تعداد شرایط ممکن کار کنه.
تنها راه یا استفاده از یک سرور واسطه هست (که حتی در روش Port punching هم برای برقراری ارتباط اولیه استفاده میشه) یا اینکه حداقل یکی از سیستمها یک سرور دارای IP قابل دسترس باشه و سیستم دیگه بصورت پیوسته در فواصل زمانی باهاش تماس بگیره یا یک کانکشن رو مدام حفظ کنه یا اینکه از روش Port punching استفاده کنی که پیاده سازی کامل و دقیق و بدون باگش اصلا کار ساده ای نیست بنظرم.