Logo

רד-בורד: ארכיון

ראשי > תיכנות > [עזרה] סוקטים - C

25/05/2007 21:15:36 T4uSBaZ
היי..
לפני כמה ימים התחלתי ללמוד WIN32API והחלק הראשון שלמדתי היה להזיז את העכבר - זאת אמרת שאוכל לדעת מהו מיקום העכבר וגם להזיזו.
עשיתי תוכנה שמאפשרת לי להזיז את העכבר דרך המקלדת, ואז רציתי לעשות תוכנה שתאפשר לי לשלוט על העכבר של הקורבן, מין סוס טרוייאני כזה.
הכל טוב ויפה, אני מפעיל את התוכנות על המחשב שלי - זה פועל אף על פי שאני לא רואה את זה ממש, אך שמתי לוגים שמאפשרים לראות את זה ולפי הפרוטוקול הכל פועל. אך אני יודע שלמחשב יש התקן LOOPBACK מה שגורם למהירות הרבה יותר גבוהה (בנוסף לכמות המידע שהוא יכול להעביר - אך זה לא משנה כי אני מעביר יחידות ביטים בכל PACKET).

הבעיה היא שכשאני מנסה על המחשב הנמען , אני שולח חבילות חבילות אך המחשב הנמען מקבל את התכולה כחבילה אחת.
לדוגמא אני שולח:
קוד:
send(sockfd,"set",3,0);
send(sockfd,"1",1,0);
send(sockfd,"10",2,0);

וככה אני רוצה שזה יגיע, ב RECV אחד.
אז התוכנית מבצעת שלושה RECV’ים, ובמחשב שלי הוא מקבל את זה:
קוד:
set
1
10
אך מצד שני במחשב מרוחק במקום אחר, זה מקבל את זה כפאקט אחד, כך:
קוד:
set110

ובכלל, אם אני שולח כמה קודים זה יכול לקבל את זה כך:
קוד:
set110set938set384set212set12344set11set92set334

וכו’.

מה אני יכול לעשות?

אם תרצו, אעלה את הסורסים.

בתודה, אבידור.

עריכה: חשבתי על עריכת הפרוקוטול. ישנה עוד דרך?[ההודעה נערכה על-ידי T4uSBaZ ב-25/05/2007 21:19:57]
01/06/2007 13:45:54 HLL
כל הכבוד שגילית את זה :)

דבר ראשון אני אסביר את השיטה הארוכה, שלדעתי הרבה יותר עדיפה על הקצרה:
בשביל זה יש דבר שקוראים לו פרוטוקול, פרוטוקול, לא נמדד בכמות send() ו recv()ים שיש לך בתוכנית.
כל אפליקציה שמתקשרת ע"ג מדיה (אזי, גם שלך) חייבת להגדיר לעצמה פרוטוקול.
במקרה שלך, זוהי פקודה ופרמטרים לפי מה שזה נראה לי. אז אתה צריך להגדיר לך פרוטוקול שאומר איפה מתחילה הפקודה, איפה היא נגמרת, איפה מתחילים הפרמטרים, מה הם, ואיפה הם נגמרים.
לרוב בפרוטוקולי Text-Based (כמו שלך או HTTP\IRC\FTP\SMTP\POP\ועוד ועוד) מפענחים את הפקודה רק אחרי שהגיע צמד CR-LF. כלומר, אם המידע מגיע בחתיכות, או שיותר מכמה פקודות מגיעות בבלוק אחד, אתה תדע את זה לפי ה CRLFים.

השיטה הקצרה:
לבטל Delay sending באפשרויות הסוקט (אל תשאל אותי איפה זה).
מה שזה עושה, חלונות לא באמת שולח כשאתה עושה לו send, הוא אוגר את זה בבאפר פנימי שלו עד שהוא מחליט שהגיע הזמן לשלוח את הנתונים, ואז הוא שולח את כל מה שיש באותו באפר.
01/06/2007 18:16:30 T4uSBaZ
ווואי, תודה רבה HLL.. :]
עמודים: 1