בתים ב-Winsock...

MotiAd

New member
בתים ב-Winsock...

היי חבריה. יש לי בתור מתכנת אפשרות לדעת כמה בתים קיימים כבר בתוך התקשרות לפני שאני קורא אותם? כלומר נניח ולפני שאני מבצע recv על כתובת מסויימת. יש לי אפשרות לדעת כמה בתים מחכים לי שם? זה חשוב. שלכם, מוטי.
 

אמיר ט

New member
ממה שאני יודע אי אפשר

לדעת את הגודל מראש לפני שאתה באמת מקבל את המידע. אני יודע שמתי שאני הייתי צריך לעשות משהו שהיה חייב את הגודל קודם אז שלחתי איזה מבנה נתונים פשוט בעל גודל קבוע וידוע (נגיד שלחתי INT שזה בייט) והוא הכיל את הגודל של מה שאני הולך לקבל.
 

MotiAd

New member
כן אני יודע...

אבל אני לא רוצה כ"כ להתבסס על זה, למרות שאני עושה את זה כגיבוי. אני לא חושב שאני יכול להתבסס על זה גם שברגע שאני אגיד ש4 הבתים הראשונים בכל משלוח מציינים את גודל ההודעה. אבל אני לא יכול לדעת מה הגודל של ההודעה שמחכה לי. וככה לא בטוח שאותם 4 בתים נמצאים בשלמותם (כי יכול להיות שהבית האחרון עדיין לא הגיע, ואז בקריאה לפונקציה צריך לחזור עליה שוב ושוב). סתם ברוך.
 

linuxius

New member
יש fcntl ב-windows

ב-unix אפשר לבדוק כמה בתים מחכים על ה-File Descriptor
 

DNile

New member
גם אם יש,

בכלל לא בטוח שזה עונה על הצרכים. השאלה היא מה הדרישות? לשלוח X בתים בצד אחד, ולקבל את כל הX בתים האלה בצד השני? אלא אם כן אתה מצהיר מראש על כמות המידע שאתה שולח, הצד השני לא ידע לכמה מידע לחכות. לגבי לבדוק כמה מידע הגיע אלייך בזמן נתון - מה אם רק חצי מהX בתים הגיעו עד עכשיו? אולי בתוך LAN לא תשים לב להבדלים, אבל כשתתחיל לעבור דרך 10 ראוטרים, 50 מתגים, 2 מודמים ו2 צלות לויין וכבל תת-ימי בין-יבשתי, יש מצב שלא כל המידע יגיע בבת אחת.
 

MotiAd

New member
ולזה בדיוק אני מתכוון...

כי בעצם הפעולה של התוכנה שלי היא מבוססת מבחינה המבנה שלה על משהו שדומה מאוד לשרת X. ובעיקרון לפחות היא צריכה לעבוד מכל מקום ע"י שימוש ב-IP. בכל מקרה בכל הודעה שאני שולח 4 הבתים הראשונים מציינים את גודל ההודעה שהצד המקבל צריך לקרוא. ואני גם יודע שיכול להיות מצב שבגלל המימוש של מע"ה היא לא תשלח את כל הבתים בבת אחת אלא חלק ואז עוד חלק. אני מודע לחלוטין לדבר הזה. וחבל. השאלה שלי היא האם יש דרך לעקוף איכשהו את העסק. כלומר לדעת כמה בתים מחכים לי.
 

MotiAd

New member
בUNIX זה יעזור. תודה כי אני מתכנן..

ליצור גירסה של המערכת גם ללינוקס יוניקס. תודה רבה על ההסבר.
 

אמיר ט

New member
המ...

אם אתה מגדיר שארבעת הבתים הראשונים של כל הודעה הם הגודל, למה שלא תבדוק מה מספר הבתים שקיבלת עד עכשיו (זה מה ש recv מחזיר) ורק כאשר תגיע ל4 תקרא את הגודל מתוך ה 4 בתים האלה.
 

MotiAd

New member
ברור שזה מה שאני עושה...

לפחות עד עכשיו. אני רואה מה recv מחזיר לי. ומשווה את זה עם אותם 4 בתים. גם לאותם 4 בתים יש קצת בלאגן. אני יודע מראש שכל הודעה חייבת להיות לפחות 4 בתים אז להם אני מחכה בהתחלה. מבצע קריאה ל-recv עם 4 בתים ורואה כמה קיבלתי, אם לא קיבלתי 4 בתים אז אנ ימבצע קריאה ל-recv שוב עם כמות בתים של 4 מינוס כמה שקיבלתי. כי לפחות לפי מה שאני מבין ברגע שקראתי ל-recv והוא מילא לי את הבפר בכמות בתים שלא משנה באיזה גודל הם נמחקו כבר. או שאני מפספס כאן משהו?
 

DNile

New member
מה שאתה בעצם מנסה לעשות,

זה ליצור מערכת של Packeting מעל Stream. אחד הדרכים זה כמו שאמרנו, לתת Length prefix. עוד שיטה שאולי תרצה להשתמש בה, מבוססת על פרוטוקול SLIP: אתה קובע מעין תו סיום(כמו ה0 בסוף המחרוזת), שאתה משדר בסוף כל פקטה שכזאת. כדי להתגבר על מצב שבו התו סיום מופיע בתוך המידע שאתה שולח, אתה עושה Escaping באמצעות תו אחר... אוקצור, תקרא את הRFC של SLIP, זה עוד מנגנון שישמש אותך היטב. אם אתה מעדיף להשאר עם האורך בהתחלה, זה גם טוב, וכן, מה שעשית זה בדיוק מה שרציך לעשות.
 

MotiAd

New member
או קיי...

תודה, אני אעשה את זה (אקרא את ה-RFC). ומה שאני עושה עכשיו זה קצת (ברוח או ברוך?) כי רציתי לחפש מנגנון פשוט קצת יותר, וחבל שאין. תודה בכל אופן.
 

DNile

New member
די, מוטי, אל תתעצל..

זה באמת שטויות... שתי פונקציות קטנות אחת לקלוט באפר בצורה הזאת, השניה לשלוח..
 

MotiAd

New member
חחחחחחחח. כן, אהה...

אבל אתה יודע אלו דבירם קטנים, אבל לא משנה. מה גם שאני רוצה להכיר את האופי של הסביבה שאני עובד איתה והספריות. (לא שחסר לי ממייקרוסופט). אבל תודה רבה בכל אופן.
 
למעלה