PDA

View Full Version : سوال: چگونه در winsock programming بک کلاس ( عکس ، هر چیزی بجز متن ) را بفرستیم ( send کنیم ) ؟



djsohrab2007
چهارشنبه 02 شهریور 1390, 02:34 صبح
با سلام خدمت تمامی دوستان ،

من دوباره مزاحم شما شدم ، من کل تاپیک هایی که در مورد winsock programming در این انجمن بود را مطالعه کردم و همچنین MSDN را ( هرچند که خوندن مطلب انگلیسی برام خیلی سخته، زبانم داغونه:گریه: ). تو google هم جست و جو کردم چیزی پیدا نکردم.

مقدمه : ما در windows sock programming برای ارسال داده ها از دستور send و برای دریافت داده ها از دستور recv که به صورت زیر تعریف شده اند استفاده می کنیم :

int send( SOCKET s, const char *buf, int len, int flags );


int recv( SOCKET s, char *buf, int len, int flags );


همانطور که مشاهده می کنید تابع send اطلاعاتی از نوع char* می فرستد و تابع recv هم اطلاعاتی از همان نوع را دریافت می کند.

سوال: چه طوری می توان اطلاعاتی را از نوع داده های دیگر ( عدد نه ها :متفکر:، منظورم یک کلاس یا یک ساختار است ) را فرستاد و دریافت کرد ؟

فکرهای من :به نظر من ما باید یک تابع send جدید تعریف کنیم که یک کلاس به عنوان ورودی بگیره و آن را به نوعی تبدیل به متن بکنه و بفرسته، از طرفی هم یک تابع recv جدید تعریف کنیم که این متن دریافتی را به نوعی دوباره تبدیل به کلاس کنه!
اگه قرار بود کد کلاس فرستاده شده از طرف تابع send ( جدید ) را فقط در خروجی چاپ کنیم که مسئله حل و بدهی بود :بامزه: ، ولی ما نمی خواهیم کد کلاس دریافتی را چاپ کنیم ، می خواهیم از این کلاس به عنوان یک کلاس جدید استفاده کنیم ( منظورم از استفاده : اینکه به عنوان ورودی برای یکی از تابع هایمان بتوانیم بفرستیم )

نکات قابل توجه :

1- منظورم از فرستادن و دریافت کلاس ، فرستادن و دریافت یک شی از کلاس است.
2- این کلاس ما به هر صورت دلخواهی می تونه تعریف شه ، و فرم خاصی در تعریف آن وجود نداره.
3- ما این برنامه را می خواهیم در یک C++ استاندارد بنویسیم ، نه C++ که گرافیکی یا همون clr. یعنی این کد را بتوان در یک empty project در VC++ کامپایل کرد.
4- در تعریف تابع send و recv جدید لازم نیست به طریقه ی ارسال و دریافت داده ها فکرم کنیم ، بلکه می توانیم از همان send و recv قبلی در این تابع های جدید استفاده کرد. می توان از یک flag برای تشخیص اینکه الان اطلاعات معمولی است ( معمولی = متن ساده ) یا غیر معمولی ( غیر معمولی = کلاس ) استفاده کنیم.

سوال تکمیلی : اگر اطلاعات ارسالی عکس ویا آهنگ بود چی ؟

با تشکر از زحمات شما ، و وقتی که گذاشتید و می خواهید بگذارید

djsohrab2007
چهارشنبه 02 شهریور 1390, 13:27 عصر
کسی نیست جواب بده ؟ حالا نظری ، چیزی ؟
بیایین با هم همکاری کنیم تا بتونیم این سوال را حل کنیم، هر کس هر فکری داره بزاره اینجا.

r00tkit
چهارشنبه 02 شهریور 1390, 13:54 عصر
هر چیزی که داری رو تبدیل کن به دیتا ( باینری ) بعد سند کن ان طرف هم بگیر کار معکوس رو انجام بده

بلاخره تو داری یه بافر رو می فرستی این بافر هر چی می خواد باشه فرقی نمی کنه

djsohrab2007
چهارشنبه 02 شهریور 1390, 16:56 عصر
هر چیزی که داری رو تبدیل کن به دیتا ( باینری ) بعد سند کن ان طرف هم بگیر کار معکوس رو انجام بده

بلاخره تو داری یه بافر رو می فرستی این بافر هر چی می خواد باشه فرقی نمی کنه


ببین فرض کن در برنامه a یک کلاس به اسم friend داریم می خواهیم یک شی از این کلاس را به برنامه b بفرستیم ( تا اینجاش همانطور که شما فرمودید کاری نداره ولی بعدش مهمه ) که در برنامه b با این اطلاعات دریافتی مثل یک شی کار کنیم مثلا آن را به یک تابع بفرستیم.

در مورد عکس و آهنگ چی ؟ ( چه طوری می خوای به دیتا تبدیلشون کنی ) راستی همون شی کلاس را چه طور به دیتا تبدیل می کنی ؟

دمت گرم داری وقت می گذاری رفیق

djsohrab2007
چهارشنبه 02 شهریور 1390, 16:59 عصر
تابعی که در برنامه b داریم رشته ای از کاراکتر را ورودی نمی گیرد !!! ( اگر می گرفت موضوع حل بود ) فرض کن یک شی از کلاس friend را ورودی می گیرد.
یعنی این کلاس در هر دو برنامه تعریف شده است

pe32_64
پنج شنبه 03 شهریور 1390, 17:23 عصر
ببین اقایdjsohrab2007 (http://barnamenevis.org/member.php?60919-djsohrab2007) من در قسمت برنامه های نوشته شده یک نمونه از یک برنامه ی چت قراردادم .شما اونو ببین شاید جوابتو بگیری...
برای فرستادن فایلها (عکس - آهنگ -فیلم)اونها را بایت به بایت ارسال و دریافت کنید.
کلاسها و ساختارها باید align شده باشند تا به صورت بایت به بایت ارسال و دریافت شوند (هنگام ارسال نمونه ای از کلاس به بایت تبدیل شود و هنگام دریافت نمونه ای از کلاس ساخته شود) و اگر در تعریفشان عدد اعشاری باشد باید به صورت استاندارد IEEE کدشودو اگر عدد صحیح بود باید به صورت Big Endian کد شود

djsohrab2007
پنج شنبه 03 شهریور 1390, 18:19 عصر
ببین اقایdjsohrab2007 (http://barnamenevis.org/member.php?60919-djsohrab2007) من در قسمت برنامه های نوشته شده یک نمونه از یک برنامه ی چت قراردادم .شما اونو ببین شاید جوابتو بگیری...
برای فرستادن فایلها (عکس - آهنگ -فیلم)اونها را بایت به بایت ارسال و دریافت کنید.
کلاسها و ساختارها باید align شده باشند تا به صورت بایت به بایت ارسال و دریافت شوند (هنگام ارسال نمونه ای از کلاس به بایت تبدیل شود و هنگام دریافت نمونه ای از کلاس ساخته شود) و اگر در تعریفشان عدد اعشاری باشد باید به صورت استاندارد IEEE کدشودو اگر عدد صحیح بود باید به صورت Big Endian کد شود




سلام،
دست شما درد نکنه فقط اون برنامه ای که فرمودید را من پیدا نکردم ، اگر لینک اون برنامه را برای من بفرستی ممنون میشم
بعد ببخشید این نکاتی که گفتی را میشه بیشتر توضیح بدی و حدالمکان با C++ کدی را برای یک برنامه کوچک مثال بزنی
می دونم خیلی وقتت را می گیره ولی اگر زحمت این را بکشی خیلی ممنونت میشم. فقط بی زحمت یک خورده سطح پایین تر توضیح بده که کامل متوجه شوم.

دستت طلا، در ضمن اسم من سهراب است یک بار به یکی از رفقا گفتیم برای ما یک ایمیل و اکانت درست کن ( برای زمان های خیلی قدیمه که هیچی بلد نبودم ) ، رفیق ما برداشت گذاشت djsohrab2007 و اون 2007 هم هیچ معنی نداره و حتی نشان گر زمان هم نیست.

djsohrab2007
شنبه 05 شهریور 1390, 02:30 صبح
سلام

من لینک پستی که گفتی را پیدا کردم ،
http://barnamenevis.org/showthread.php?122363-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D9%86%D9%88%D8%B4%D8%AA%D9%87-%D8%B4%D8%AF%D9%87-%D8%A8%D8%A7-vc&p=1276880&viewfull=1#post1276880

نگاه می کنم اشکالاتم را می پرسم، ممنون

djsohrab2007
شنبه 05 شهریور 1390, 15:03 عصر
خوب 2 تا نکته و 2 سوال :
نکات :
1. برنامه ای که نوشتی دکمه send آن کار نمی کند ( البته مهم نیست با کمک تغییر درست میشه )
2. برنامه چت شما هم کاراکتر می فرستد ، توانایی فرستادن شی از کلاس و یا عکس را ندارد ،
سوالات :
1. چرا وقتی به سرور با پورت 9090 متصل میشه در آنجا میزنه که کانت شما به سرور با پوردت "هر پرتی به جز 9090" موفقیت آمیز بود ؟؟؟
2. میشه چیزایی که گفتی را توضیح بدی ؟