לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 22-08-2008, 05:33
  Dragonion Dragonion אינו מחובר  
 
חבר מתאריך: 22.08.08
הודעות: 310
העברת כתובת בין sockets

שלום.
ברצוני להעביר מידע רב באמצעות sockets בין מחשבים. כידוע (או שלא) לכם, אפשר להעביר בשקעים רק מצביע של אות (char*).
כרגע יש לי רק שני floatים אז העברתי את הכתובת שלהם וככה השגתי את השווי שלהם (אחרי שניסיתי עם בערך 20000 שיטות להכניס את שניהם לchar*).
עכשיו אני רוצה להתקדם עם זה ולהעביר struct שלי שיכלול בתוכו את כל מה שאני צריך.
ניסיתי להעביר אותו באותה צורה, מכיוון שלפי מה שהבנתי זה אמור תמיד לעבוד (וכי למה לא?) אבל זה לא עבד.
יש איזה שהוא טריק? או אולי אי אפשר משום מה?

הקריאה לפונקציות עם הfloatים נראית ככה

קוד PHP:
 send(mySocket,(char*)&myFloat,256,0);
recv(mySocket,(char*)&myFloat,256,0


וכמו שאמרתי, אותו דבר על סתרכת לא פועל
קוד PHP:
 send(mySocket,(char*)&myStruct,256,0);
recv(mySocket,(char*)&myStruct,256,0
תודה על כל עזרה


נערך לאחרונה ע"י Dragonion בתאריך 22-08-2008 בשעה 05:38.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 22-08-2008, 08:27
צלמית המשתמש של המממ
  המממ המממ אינו מחובר  
 
חבר מתאריך: 30.10.01
הודעות: 8,699
Follow me...
עוד משהו
בתגובה להודעה מספר 2 שנכתבה על ידי המממ שמתחילה ב "Serialization"

עבר זמן העריכה, לכן אוסיף הסבר קצר כאן.

למה הדוגמא הראשונה (float) עובדת ואילו השניה (struct) לא עובדת?

שים לב שאתה לא מעביר כתובות בין sockets - לכתובות אין משמעות בצד השני
אתה מעביר את תוכן המשתנים.

הפונקציה send מקבלת מצביע למחרוזת בתים (char*) ולכן כאשר אתה רוצה לתרגם משתנה למצביע אתה מוסיף לו & שמחזיר את כתובת התא שמאחסן אותו.
עכשיו הפקודה send חושבת שהיא קוראת בתים מתא זיכרון המכיל float
נדמה לי שאמרת לפקודה לקרוא 256 בתים
למיטב ידיעתי יש לך פה חריגה float מאוחסן ב32 ביט וdouble ב64 (4 ו8 בתים בהתאמה)
עדיף להשתמש ב (sizeof(MyFloat כדי לקבל את הגודל המדוייק.

הפקודה השניה שלך לא עובדת משום שמצביע על sturct יחזיר את הכתובת של המשתנה הראשון
אבל שאר המשתנים לא מאוחסנים ברצף.
יש padding ביניהם
כאן תמצא דוגמא: http://www.codeguru.com/forum/showthread.php?t=276622

בסופו של דבר, אני לא בטוח שאתה צריך להמיר את המצביע ל *char. על פי המבנה שמופיע אצלי אתה יכול להעביר מצביע כללי מסוג (*void)
הנה http://www.rt.com/man/send.2.html
התבנית המלאה:
קוד:
int send(int s, const void *msg, int len, unsigned int flags);

שים לב שאני כותב ביוניקס כך שאולי במערכת ההפעלה שלך זה שונה
_____________________________________
_________________________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
אזהרה: משרד הבריאות קובע כי העישון מזיק לבריאות !
תראו, אפילו החייזר נהיה ירוק מזה


נערך לאחרונה ע"י המממ בתאריך 22-08-2008 בשעה 08:31.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 24-08-2008, 12:43
צלמית המשתמש של המממ
  המממ המממ אינו מחובר  
 
חבר מתאריך: 30.10.01
הודעות: 8,699
Follow me...
פיספסת משהו
בתגובה להודעה מספר 6 שנכתבה על ידי Dragonion שמתחילה ב "עם ככה אני כביכול בכלל לא..."

נדמה לי שבאחת הדוגמאות בקישורים שנתתי באמת כותבים את הנתונים לקובץ.
אבל אולי חשוב להין שאין הרבה הבדל בין כתיבה לקובץ לבין כתיבה לsocket
בשני המקרים אתה צריך להפוך מידע המיוצג בזכרון של התוכנית במבנה נתונים כלשהו שלך לרצף תווים ובחזרה

אם כתבת את הנתונים לקובץ הם חייבים להשאר שם גם אחרי שהתוכנית שלך תסתיים והזיכרון שלה יתנקה
כדי שבפעם הבאה שהיא תעלה היא תוכל לקרוא את הקובץ ולאכלס מחדש את תאי הזכרון.

זה בדיוק מה שקורה במערכת שרת-לקוח. צד אחד כותב והשני קורא
ביוניקס הפעולות הללו מאוד דומות...
_____________________________________
_________________________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
אזהרה: משרד הבריאות קובע כי העישון מזיק לבריאות !
תראו, אפילו החייזר נהיה ירוק מזה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 25-08-2008, 22:02
צלמית המשתמש של המממ
  המממ המממ אינו מחובר  
 
חבר מתאריך: 30.10.01
הודעות: 8,699
Follow me...
לא ניסיתי
בתגובה להודעה מספר 9 שנכתבה על ידי Dragonion שמתחילה ב "[QUOTE=המממ]בשני המקרים אתה..."

אבל אתה יכול להעזר בשני הקישורים שהבאתי בתגובה הראשונה.

אתה יכול להעזר בדוגמא שבקישור הראשון אבל במקום לכתוב לאובייקט מסוג ofstream תשתמש באובייקט מסוג ostringstream כמו באחת התגובות שבקישור השני:
קוד PHP:
 ostringstream buf;
buf.write( ... );
buf.write( ... );
buf.write( ... );
buf.write( ... );
....
string block buf.str();
block.data(); // the raw data
block.size(); // the size of the raw data 


בסוף תעביר לsend את הכתובת של block (על ידי block&) ואת הגודל שלו כמו בדוגמא.
_____________________________________
_________________________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
אזהרה: משרד הבריאות קובע כי העישון מזיק לבריאות !
תראו, אפילו החייזר נהיה ירוק מזה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 21:03

הדף נוצר ב 0.05 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר