ABA


"C# בעיה עם מימוש TCP סרבר"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15458 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15458
Static
חבר מתאריך 1.7.02
1329 הודעות, דרג אמינות חבר זה
   09:50   06.09.09   
אל הפורום  
  C# בעיה עם מימוש TCP סרבר  
 
   עבר עריכה לאחרונה בתאריך 06.09.09 בשעה 09:50:43 על-ידי Nesher (מנהל הפורום)
 
הבעיה היא שכאשר קליינט מתחבר לסרבר שבניתי הוא שולח סטרינגים אחד אחרי השני שמתחילים ומסתיימים ב-CHARים מיוחדים שהחלטתי עליהם מראש.

לפעמים השליחה מתבצעת מהר מדיי והסרבר שלי "לא שם לב" לזה שהגיע ה CHAR שמסמל סיום של סטרינג ואז הוא קולט 2 סטרינגים יחד.

הנה קטע הקוד של האזנה לקליינט:


private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream ns = tcpClient.GetStream();
byte[] message = new byte[4096];
int bytesRead = 1;

string currentMessage = string.Empty;
string currentInst = string.Empty;
ASCIIEncoding encoder = new ASCIIEncoding();

while (true)//ns.DataAvailable
{
if (bytesRead == 0)
break;
try
{
bytesRead = ns.Read(message, 0, 4096);
}
catch
{
break;
}

currentMessage = encoder.GetString(message, 0, bytesRead);
AddTextToTextBox(currentMessage);
if (!string.IsNullOrEmpty(currentMessage))
{
if ((currentMessage[0] == STX) &&
(currentMessage[currentMessage.Length - 1] == ETX))
{
currentInst += currentMessage;
AddItemToQueue(currentInst);
AddDataToRow(tcpClient.Client.RemoteEndPoint.ToString(), currentInst);
currentInst = string.Empty;
}
}
createQuery();
}
AddTextToTextBox(tcpClient.Client.RemoteEndPoint.ToString() + " - Disconnected on: " + DateTime.Now);
RemoveItemFromDataGrid(tcpClient.Client.RemoteEndPoint.ToString());
tcpClient.Close();
}

איך אפשר לייעל את העבודה שיקלוט את ה CHAR שנקרא STX בתור תחילת מחרוזת
ואת ה CHAR שנקרא ETX בתור סוף המחרוזת

תודה מראש לעוזרים


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אני לא חושב שזו הבעיה. עד כמה שאני זוכר ה-Read ldan192  06.09.09 11:29 1
     אני לא בטוח בעצמי איפה הבעיה... Static 06.09.09 11:39 2
         תעשה stepbystep ותוודא שהגודל מתאים, או שפתאום עם ldan192  06.09.09 13:07 3
  אנלא יודע C# אבל מה שהייתי עושה בC++ זה גם קולט תו תו.. By-king 06.09.09 14:36 4
     הקטע שיש לו את ה-encoder הזה. אתה לא יודע בדיוק איך הוא ldan192  06.09.09 16:54 5
         בייט בייט אבל כע :) By-king 06.09.09 23:00 9
  תיקנתי לך את התצוגה של הקוד... Nesher  06.09.09 19:17 6
     כן, אני יעלה את הקוד המלא מחרתיים כי זה על מחשב מרוחק Static 06.09.09 20:30 7
         גם אני לא מאמין שהבעיה במחלקה המקודדת Nesher  06.09.09 21:59 8
             הלקוח נבנה ע''י מישהו בצוות אחר ב C++ Static 07.09.09 14:11 10
             הנה הקוד המלא בצד השרת Static 08.09.09 08:10 11

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:29   06.09.09   
אל הפורום  
  1. אני לא חושב שזו הבעיה. עד כמה שאני זוכר ה-Read  
בתגובה להודעה מספר 0
 
במקרה הזה קורא עד סוף הפאקט הנוכחי ורק אחרי זה קורא את הפאקט הבא. הוא לא משלב בין הפאקטים סתם ככה (כשאתה עושה Read).

לפי מה שאני רואה, משהו פה עם ה-encoder של ה-currentMessage עלול להיות תקול.
מה אתה אומר?


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות, דרג אמינות חבר זה
   11:39   06.09.09   
אל הפורום  
  2. אני לא בטוח בעצמי איפה הבעיה...  
בתגובה להודעה מספר 1
 
   אני מקבל ב 99% מהפעמים את המידע תקין.
ומדיי פעם יוצא איזה סטרינג סורר שנראה משהו כזה:

STXaaaaaaaaaaETXSTXaaaaaaaaaaaETX

מבחינת הקוד שלי זה סטרינג תקין כי הוא מתחיל ב STX ונגמר ב ETX
והוא לא שם לב שזה בעצם 2 סטרינגים.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   13:07   06.09.09   
אל הפורום  
  3. תעשה stepbystep ותוודא שהגודל מתאים, או שפתאום עם  
בתגובה להודעה מספר 2
 
ה-encoder שנדפק.

ובכלל, השירות ששולח את הפאקט, איפה המימוש שלו?
יכול להיות ששם איכשהו הוא מבצע שרשור לטקסט בין 2 פאקטים מבלי לשלוח אותם בינהם.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
By-king לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
31427 הודעות, 1 פידבק, 2 נקודות
   14:36   06.09.09   
אל הפורום  
  4. אנלא יודע C# אבל מה שהייתי עושה בC++ זה גם קולט תו תו..  
בתגובה להודעה מספר 0
 
   פשוט קרא גם תו תו ורק שאתה מקבל אנערף \0 (לא יודע אם זה נשלח בC# אבל בC++ זה כן...) ואז "תעלה" את זה למעלה...
זה בטוח יעבוד לך...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   16:54   06.09.09   
אל הפורום  
  5. הקטע שיש לו את ה-encoder הזה. אתה לא יודע בדיוק איך הוא  
בתגובה להודעה מספר 4
 
ממומש ובעיניי שם נעוצה הבעיה.
כי אם אתה חותך את הפאקט באמצע (בגלל שהפאקט יותר גדול מ-4080 ביטים או כמה שהוא הגדיר שם) זה יכול לדפוק את המימוש של האנקודר.

אין שום סיבה אבל כשהוא לא לוקח ביט ביט שזה לא יעבוד חוץ מזה... במיוחד בשפה כמו #C


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
By-king לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
31427 הודעות, 1 פידבק, 2 נקודות
   23:00   06.09.09   
אל הפורום  
  9. בייט בייט אבל כע :)  
בתגובה להודעה מספר 5
 
   אנלא יודע איך הENCODER הזה עובד ^^
אבל בייט בייט יעבוד לו בדוק


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק, 43 נקודות
   19:17   06.09.09   
אל הפורום  
  6. תיקנתי לך את התצוגה של הקוד...  
בתגובה להודעה מספר 0
 
יש לך אפשרות להעלות את הקוד המלא לפה??


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות, דרג אמינות חבר זה
   20:30   06.09.09   
אל הפורום  
  7. כן, אני יעלה את הקוד המלא מחרתיים כי זה על מחשב מרוחק  
בתגובה להודעה מספר 6
 
   ואין לי גישה אליו עד יום שלישי.

ה ENCODER הוא מחלקה של C# אני לא חושב ששם הבעיה, אבל אני יעלה את הקוד המלא ואז אולי התמונה תתבהר יותר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק, 43 נקודות
   21:59   06.09.09   
אל הפורום  
  8. גם אני לא מאמין שהבעיה במחלקה המקודדת  
בתגובה להודעה מספר 7
 
השאלה אם עשית את זה גם בשרת וגם בלקוח..?
ניסית קידוד אחר או רק זה?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות, דרג אמינות חבר זה
   14:11   07.09.09   
אל הפורום  
  10. הלקוח נבנה ע''י מישהו בצוות אחר ב C++  
בתגובה להודעה מספר 8
 
   זאת תוכנה שהיא EMBEDDED באיזה רובוט שאין לי ממש גישה אליו, אבל אולי אני אוכל להשיג את הקוד שלו ב C++ ולראות איך הוא בעצם שולח את המידע...

חכה למחר יהיה לי את הקוד, ותודה על העזרה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות, דרג אמינות חבר זה
   08:10   08.09.09   
אל הפורום  
  11. הנה הקוד המלא בצד השרת  
בתגובה להודעה מספר 8
 
   צירפתי את קובץ ה CS כקובץ TXT
אם משהו לא מובן תשאלו

https://rotter.name/User_files/nor/4aa5e6f835498bd4.txt

תודה !


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net