PDA

View Full Version : سوال: دریافت داده از UDP با تابع recvfrom یا recv



Aghaeifar
سه شنبه 22 اردیبهشت 1394, 13:02 عصر
سلام و وقت بخیر

برای یه ارتباط ساده UDP بین دو تا رایانه کمی سوکت پرورگرامینگ در سی ++ خوندم و یه برنامه ای رو در حال ویرایش هستم. چند سوال اساسی در ذهنم ایجاد شد که ممنون میشم راهنمایی کنید.
من توابع recvfrom یا recv در طرف کلاینتم برای دریافت داده استفاده می کنم. سرور داره پیوسته یه رشته ای۲۰ کارکتری رو ارسال می کنه.



سوال اولم اینه که اگر من recvfrom رو فراخوانی کنم ممکنه که یه دفعه از وسط رشته ی دریافتی شروع به خوندن کنه؟ یا همیشه درست می خونه خودش؟ یعنی مثلا سرور رشته "abcdefghijklmnopqrst" رو ارسال کنه اما زمان فرخوانی تابع recvfrom در برنامه همزمان شه با دریافت کارکتر g در کلاینت. لذا از اینجا به بعد رو می خونه؟ یا کلا این رشته رو بی خیال میشه و صبر می کنه یک رشته ۲۰ کارکتری جدید وارد بشه؟
سوال دومم این است که اگر recvfrom رو فراخوانی کردم و داده ای هنوز نیومده باشه چقدر صبر می کنه تا داده بیاد اگر نیومد خطا بر می گردونه؟ باید در همون لحظه ی فراخوانی تابع recvfrom داده ای از طریق پروتکل UDP وارد کلاینت بشه؟
سوال سومم اینه که اینجا آیا ما بافر داریم؟ یعنی اگر من مدتی چیزی در کلاینت نخونم و بعد تابع recvfrom رو صدا بزنم می ره اولین داده ای خوانده نشده که مدتی قبل اومده و در بافر ذخیره شده رو می خونه یا نه به روزترین داده ی ارسال شده از طرف سرور رو می خونه؟


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

negative60
سه شنبه 22 اردیبهشت 1394, 16:15 عصر
برای انتقال اطلاعات مهم و ارسال فايل از UDP استفاده نکنيد چون امکان از دست رفتن اطلاعات وجود داره از اين پروتکل برای انتقال اطلاعاتی استفاده ميشه که اگر هم از دست رفت تأثير چندانی در روند کار نداشته باشه مثل انتقال صدا يا تصوير يا بازی های آنلاين که اگر هم چند بسته اي اين وسط از دست رفت نهايتاً يک لحظه صدا قطع و وصل ميشه يا تصوير خش دار يا در بازی به صورت لگ ديده ميشه




سوال اولم اینه که اگر من recvfrom رو فراخوانی کنم ممکنه که یه دفعه از وسط رشته ی دریافتی شروع به خوندن کنه؟ یا همیشه درست می خونه خودش؟ یعنی مثلا سرور رشته "abcdefghijklmnopqrst" رو ارسال کنه اما زمان فرخوانی تابع recvfrom در برنامه همزمان شه با دریافت کارکتر g در کلاینت. لذا از اینجا به بعد رو می خونه؟ یا کلا این رشته رو بی خیال میشه و صبر می کنه یک رشته ۲۰ کارکتری جدید وارد بشه؟

در tcp اين امکان داره چند بسته در يک بسته ادغام بشن اما تو udp بسته ها شکسته نميشن, پکت يا دريافت ميشه يا نميشه

Aghaeifar
سه شنبه 22 اردیبهشت 1394, 16:32 عصر
برای انتقال اطلاعات مهم و ارسال فايل از UDP استفاده نکنيد چون امکان از دست رفتن اطلاعات وجود داره از اين پروتکل برای انتقال اطلاعاتی استفاده ميشه که اگر هم از دست رفت تأثير چندانی در روند کار نداشته باشه مثل انتقال صدا يا تصوير يا بازی های آنلاين که اگر هم چند بسته اي اين وسط از دست رفت نهايتاً يک لحظه صدا قطع و وصل ميشه يا تصوير خش دار يا در بازی به صورت لگ ديده ميشه



در tcp اين امکان داره چند بسته در يک بسته ادغام بشن اما تو udp بسته ها شکسته نميشن, پکت يا دريافت ميشه يا نميشه

خیلی ممنون از توضیحتون. بله متوجه این مسائل هستم. اما متاسفانه سرور دست من نیست و من فقط می تونم برنامه ی کلاینت رو بنویسم. برنامه ای که در سرور در حال اجرا شدن یک سری داده رو در شبکه از طریق UDP ارسال می کنه و من نیاز دارم این داده ها رو بخونم.

abol_fa
چهارشنبه 23 اردیبهشت 1394, 14:43 عصر
سلام و وقت بخیر

برای یه ارتباط ساده UDP بین دو تا رایانه کمی سوکت پرورگرامینگ در سی ++ خوندم و یه برنامه ای رو در حال ویرایش هستم. چند سوال اساسی در ذهنم ایجاد شد که ممنون میشم راهنمایی کنید.
من توابع recvfrom یا recv در طرف کلاینتم برای دریافت داده استفاده می کنم. سرور داره پیوسته یه رشته ای۲۰ کارکتری رو ارسال می کنه.



سوال اولم اینه که اگر من recvfrom رو فراخوانی کنم ممکنه که یه دفعه از وسط رشته ی دریافتی شروع به خوندن کنه؟ یا همیشه درست می خونه خودش؟ یعنی مثلا سرور رشته "abcdefghijklmnopqrst" رو ارسال کنه اما زمان فرخوانی تابع recvfrom در برنامه همزمان شه با دریافت کارکتر g در کلاینت. لذا از اینجا به بعد رو می خونه؟ یا کلا این رشته رو بی خیال میشه و صبر می کنه یک رشته ۲۰ کارکتری جدید وارد بشه؟
سوال دومم این است که اگر recvfrom رو فراخوانی کردم و داده ای هنوز نیومده باشه چقدر صبر می کنه تا داده بیاد اگر نیومد خطا بر می گردونه؟ باید در همون لحظه ی فراخوانی تابع recvfrom داده ای از طریق پروتکل UDP وارد کلاینت بشه؟
سوال سومم اینه که اینجا آیا ما بافر داریم؟ یعنی اگر من مدتی چیزی در کلاینت نخونم و بعد تابع recvfrom رو صدا بزنم می ره اولین داده ای خوانده نشده که مدتی قبل اومده و در بافر ذخیره شده رو می خونه یا نه به روزترین داده ی ارسال شده از طرف سرور رو می خونه؟


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

1-این رو اطمینان ندارم اما بعید میدونم از نظر زمان بندی ممکن باشه که شما بتونید قبل از رسیدن به بسته داده بسته دیگه ای رو ارسال کنید.تنها عامل تیکه شدن بسته ها MTU هستش و یا این که سیستم عامل شما بنا به دلایلی تصمیم میگره همه دیتا رو با هم ارسال نکنه.
2-تابع اینقدر منتظر میمونه تا یه چیزی برسه مگر اینکه با setsockopt() زمان Timeout رو تعیین کنید
3-یکی از آرگومان های تابع recvfrom() یه یافر هستش.


int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
struct sockaddr *from, int *fromlen);
اما بعد از صدا زده شدن تابع بافر ورودی خالیه و تابع منتظر دیتا میمونه