ABA


"|עזרה| בסוקטים."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10573 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10573
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   22:57   18.01.12   
אל הפורום  
  |עזרה| בסוקטים.  
 
   ערכתי לאחרונה בתאריך 18.01.12 בשעה 23:07 בברכה, Yariv-H
 
טוב אני יודע שזה לא ממש ריאלי אבל אם יש מישהוא שיוכל לעזור לי אני אשמח מאוד.
אני יושב על הפרוייקט הזה דיי הרבה זמן
ואני תקוע במשהוא שאין לי מושג למה הוא קורא.

בניתי אפליקציה שמתחברת לשרת , שואבת ממנו נתונים , ועם הנתונים האלו מתחברת ב P2P ב UDP ו TCP לתחנות אחרות ומעלה קבצים של תמונות.


יש לי בעייה שאחרי שאני עושה fclose לקובץ התוכנית פשוט קורסת
אני מקבל את ה סטאק של הזיכרון , ניסיתי לקרוא בכול מיני אתרים ואומרים שם שה fclose מנקה את הבאפרים ומשחרר זיכרונות שהוא תפס.

אם אני לא מבצע את ה fclose הזה התוכנית לא קורסת אבל הקובץ לא נסגר.

אם למישהו יש רעיון או שבא לו לעזור לי ולהעיף מבט על הקוד יעשה אותי מאושר.

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


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

**הקוד הוא ב C



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

  האשכול     מחבר     תאריך כתיבה     מספר  
  תעלה את הקטעי קוד הרלוונטים, נראה איך אפשר לעזור Net_Boy  19.01.12 01:13 1
     מכתב Yariv-H 19.01.12 22:37 2
         המממ Net_Boy  20.01.12 14:45 3
             מכתב Yariv-H 20.01.12 15:57 4
                 אז ככה Net_Boy  20.01.12 16:39 5
                     מכתב Yariv-H 20.01.12 16:43 6
                         פיספסתי את זה אבל מה עם הדברים הבאים Net_Boy  20.01.12 17:12 7
                             מכתב Yariv-H 20.01.12 17:19 8
                                 השורות אצלי התבלגנו Net_Boy  20.01.12 17:32 9
                                     מכתב Yariv-H 20.01.12 18:05 10
                                         ממש מוזר Net_Boy  20.01.12 21:25 11
                                             אחלה Yariv-H 20.01.12 22:21 12
                                                 בכיף Net_Boy  21.01.12 00:19 13
                                                     נוסו כבר =] Yariv-H 21.01.12 00:40 14

       
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   01:13   19.01.12   
אל הפורום  
  1. תעלה את הקטעי קוד הרלוונטים, נראה איך אפשר לעזור  
בתגובה להודעה מספר 0
 
   תנסה אבל להיות מתומצת ולהעלות רק את הקוד שקשור לפתיחה\קריאה\כתיבה\סגירה של הקובץ.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   22:37   19.01.12   
אל הפורום  
  2. מכתב  
בתגובה להודעה מספר 1
 
   הבעייה היא שאני לא יודע כול כך איפה הבעייה.

הינה הקטע של פתיחת הקובץ וסגירתו


FILE *openfile;


/*Opening the file*/

filePath=(char *)malloc(sizeof(char)*70);
if(!strcmp(picToSEND->dirName,"Pic"))
{
sprintf(filePath,"Pic/%s",picToSEND->FileName);
//FILE *openfile = fopen ( filePath, "r" );
openfile = fopen ( filePath, "r" );
if ( openfile == 0 )
{
printf( "Could not open file\n" );
exit(1);
}
}
else if(!strcmp(picToSEND->dirName,"UploadedPic"))
{
sprintf(filePath,"UploadedPic/%s",picToSEND->FileName);
//FILE *openfile = fopen ( filePath, "r" );
openfile = fopen ( filePath, "r" );
if ( openfile == 0 )
{
printf( "Could not open file\n" );
exit(1);
}
}


while(bytesToSend>0)
{
if(RetransmitCounter<6)
{
if (NextPack==1)
{
/*Getting the next chank from file*/

//printf("\n\nBytes left to send %d\n",bytesToSend);

if(ACK=='1')
{
ACK='0';
}
else
{
ACK='1';
}

if (bytesToSend>511)
{
// printf("reading next chank from file\n");
memset(line,0,sizeof(line));
readnum=fread(line,1,511,openfile);
Packetnum=Packetnum+1;

//printf("*open file pointer %d\n",openfile);
//printf("read from file : %s\n",line);
//printf("reading 511 bytes\n\n");

/*Fix*/
memset(packet,0,sizeof(packet));
sprintf(packet,"%c",ACK);
memcpy(&packet,line,511);
/*/
NextPack=0;
}
else
{//last packet

readnum=fread(line,1,bytesToSend,openfile);
Packetnum=Packetnum+1;

//printf("*open file pointer %d\n",openfile);

/*FIX*/
memset(packet,0,sizeof(packet));
sprintf(packet,"%c",ACK);
memcpy(&packet,line,bytesToSend);
/*/
NextPack=0;
}

}

slen=sizeof(UPDsocket);
//printf("Sending now %s\n",packet);
sendto(Soc, packet, readnum+1, 0, &UPDsocket, slen);

/*timeout for ack*/
tv.tv_usec=500000;
tv.tv_sec=0;
FD_ZERO(&read_set);
FD_SET(Soc,&read_set);

resulte=select(Soc+1,&read_set,NULL,NULL,&tv);

if(resulte>0)
{

if(FD_ISSET(Soc,&read_set))
{
/*handle getting thisData*/
slen=sizeof(recvFromSocket);
recvfrom(Soc, ACKrec, 1,0,(struct sockaddr *)&recvFromSocket,&slen);

if(ACK==ACKrec)
{
sprintf(RecvIpAddress,"%s",inet_ntoa(recvFromSocket.sin_addr));
if(!strcmp(RecvIpAddress,IpAddress))
{
//got the ack that expected and also from the destination that sent to.
NextPack=1;
RetransmitCounter=0;

bytesToSend=bytesToSend-readnum;

}
else
{
RetransmitCounter++;

}
}
else
{
RetransmitCounter++;

}
}
}
else if(resulte==0)
{

RetransmitCounter++;
}
}
else
{
printf("Error : Stoping Upload after 5 Retransmition .\n");
fclose(openfile);
close(Soc);
return;
}

}


** close(openfile); ***-
close(Soc);

return;
}

השורה שסימתני ב **** זאת השורה שאם אני משנה אותה ל
fclose דופקת לי את הכול.

הקוד עצמו הוא 2000 שורות ניסיתי לתת כמה שפחות פה..

**לא הצלחתי ליישר פה לשמאל...

תודה על העזרה!!



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   14:45   20.01.12   
אל הפורום  
  3. המממ  
בתגובה להודעה מספר 2
 
   יש לי פה כמה כיווני מחשבה:

1) לוודא שאתה לא חורג מהגבולות של הקובץ ודורס זכרון שאסור לך - זה הניחוש הכי טוב שלי ללמה זה קורה פה.
2) לוודא שהקובץ לא NULL לפני שסוגרים אותו, אם איכשהו ה file handle התאפס לך אז fclose(NULL) תמיד יקרוס.

מעבר לזה, כמה טיפים חשובים בעיניי

1) הלולאה הזאת צריכה להיות הרבה יותר מודולרית בעיניי, אפשר לחלק פה לפונקציות ולעשות קצת סדר.
2) אל תשתמש לעולם במספרי קסם, דברים כמו 511 צריך להעביר לקבועים.

אם זה לא עוזר, אתה מוזמן לעלות את הפרויקט, אני מאמין שעם דיבגר צ'יק צ'ק אני אמצא את הבעייה.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   15:57   20.01.12   
אל הפורום  
  4. מכתב  
בתגובה להודעה מספר 3
 
   בדקתי שלפני הסגירה של הקובץ הוא לא NULL , לגבי ה 511 .
הכוונה שלך לקבע אותו בדיפיין ולהעביר אותו?
ניסיתי גם זה .

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

שלחתי לך את הלינקים בפרטי.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   16:39   20.01.12   
אל הפורום  
  5. אז ככה  
בתגובה להודעה מספר 4
 
   אין לי פה Cygwin או VM.
אז זה קצת בעייתי לי לדבג את זה.

אבל אני משוכנע ב99% שהבעייה שלך טמונה בעובדה שאתה קורא מהקובץ מבלי להתחשב בכלל בגודל שלו.

אתה כל פעם גולש לזכרון שאסור לך ולכן אתה קורס.

תשיג את גודל הקובץ:
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

ותהיה בטוח שאתה תמיד קורא את :
min(fileSize - readOffset, bufferSizeRequired)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   16:43   20.01.12   
אל הפורום  
  6. מכתב  
בתגובה להודעה מספר 5
 
   שורה 1252

if(stat(filePath, &s) == 0) {
file_len = s.st_size;
sprintf(filesize,"%d",(int)file_len);
} else {
printf("SendFileOverUDP Error getting file size\n");
}
//bytesToSend=atoi(filesize);
bytesToSend=file_len;

אני כן בודק מה הגודל שלו..
אחרת לא הייתי יודע כמה לשלוח....



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   17:12   20.01.12   
אל הפורום  
  7. פיספסתי את זה אבל מה עם הדברים הבאים  
בתגובה להודעה מספר 6
 
   שורה 1264 :
קריאה מבלי להתחשב בגודל, כנראה שזה לא קורס בגלל זה אבל עלולים להיות מקרי קצה שצריך לטפל בהם.

בוא תגיד לי אם הבנתי נכון.
לכל פקט אתה מקצה 511 בתים.
בפקט הראשון אתה שולח איזשהו Header , נשאר לך מקום נוסף בבאפר ולכן, בנוסף אתה קורא מהקובץ :


(511 - Header) בתים

עם זה אתה ממלא את הפקט הראשון.

עכשיו שקיבלת תשובה שהפקט הגיע ליעד אתה מחסר :


bytesToSend=bytesToSend-readnum;

ה readNum הזה אמור להיות 511 למרות שבפועל קראת פחות בתים מזה.
ואז האופסטים אמורים להתבלגן לך.

אני מפספס פה משהו?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   17:19   20.01.12   
אל הפורום  
  8. מכתב  
בתגובה להודעה מספר 7
 
   לא הבנתי את ההערה לגבי שורה 1264,
זה מה שמופיע אצלי.
/*Sending the first packet with the header*/

נכון לכול פאקט זה 511 בתים שאני מוסיף לו בית נוסף בהתחלה של סיקוונס.

ה readnum מקבל בשורה 1272 את הגודל של הבתים של הפאקט הראשון שנקרא מהקובץ.

אחרי שהוא מקבל תשובה bytesToSend מחסר את החלק היחסי של התוכן שנשלח בפאקט הראשון.

לכן בשורה 1342 זה בסדר, זה רק לפאקט הראשון.
בשורה 1383 זה הרוטינה של שליחת כול שאר המידע.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   17:32   20.01.12   
אל הפורום  
  9. השורות אצלי התבלגנו  
בתגובה להודעה מספר 8
 
   לגבי ההודעה הקודמת התכוונתי לשורה 1272
זה סתם הערה שלא ממש קשורה לעניין, יכול להיות מקרה קצה שבו הקובץ קטן מ 511-HeaderLen
וצריך לטפל בו.


עכשיו לעניין הראשי
אני התבלבלתי, אני חשבתי ש readNum זה משתנה שאומר כמה בתים נכתבו לסוקט.
אז בהסתכלות שנייה זה כן נראה בסדר.

בוא נעשה troubleshoot אחר.

1) מה קורה אם אתה פותח את הקובץ ומיד אחרי זה סוגר אותו?
2) מה קורה אם אתה פותח את הקובץ, קורא את כל התוכן שלו ואז מיד סוגר אותו?
3) מה קורה אם אתה עושה fseek לתחילת הקובץ ואז סוגר את הקובץ?



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   18:05   20.01.12   
אל הפורום  
  10. מכתב  
בתגובה להודעה מספר 9
 
   כאשר אני פותח אותו וישר סוגר אותו . עדין התוכנית קורסת

*** glibc detected *** /home/yariv/workspace/Socket/Debug/Socket: free(): invalid next size (normal): 0x08a39330 ***
=== Backtrace: =====
/lib/i386-linux-gnu/libc.so.6(+0x6ebc2)
/lib/i386-linux-gnu/libc.so.6(+0x6f862)
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)
/home/yariv/workspace/Socket/Debug/Socket
/home/yariv/workspace/Socket/Debug/Socket
/home/yariv/workspace/Socket/Debug/Socket
/home/yariv/workspace/Socket/Debug/Socket
/home/yariv/workspace/Socket/Debug/Socket
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)
/home/yariv/workspace/Socket/Debug/Socket
=== Memory map: ====
00260000-00261000 r-xp 00000000 00:00 0
0038d000-003a9000 r-xp 00000000 07:00 1063 /lib/i386-linux-gnu/libgcc_s.so.1
003a9000-003aa000 r--p 0001b000 07:00 1063 /lib/i386-linux-gnu/libgcc_s.so.1
003aa000-003ab000 rw-p 0001c000 07:00 1063 /lib/i386-linux-gnu/libgcc_s.so.1
003bc000-003da000 r-xp 00000000 07:00 1029 /lib/i386-linux-gnu/ld-2.13.so
003da000-003db000 r--p 0001d000 07:00 1029 /lib/i386-linux-gnu/ld-2.13.so
003db000-003dc000 rw-p 0001e000 07:00 1029 /lib/i386-linux-gnu/ld-2.13.so
0087a000-00891000 r-xp 00000000 07:00 1102 /lib/i386-linux-gnu/libpthread-2.13.so
00891000-00892000 r--p 00016000 07:00 1102 /lib/i386-linux-gnu/libpthread-2.13.so
00892000-00893000 rw-p 00017000 07:00 1102 /lib/i386-linux-gnu/libpthread-2.13.so
00893000-00895000 rw-p 00000000 00:00 0
00be1000-00d57000 r-xp 00000000 07:00 1042 /lib/i386-linux-gnu/libc-2.13.so
00d57000-00d59000 r--p 00176000 07:00 1042 /lib/i386-linux-gnu/libc-2.13.so
00d59000-00d5a000 rw-p 00178000 07:00 1042 /lib/i386-linux-gnu/libc-2.13.so
00d5a000-00d5d000 rw-p 00000000 00:00 0
08048000-08050000 r-xp 00000000 07:00 289578 /home/yariv/workspace/Socket/Debug/Socket
08050000-08051000 r--p 00007000 07:00 289578 /home/yariv/workspace/Socket/Debug/Socket
08051000-08052000 rw-p 00008000 07:00 289578 /home/yariv/workspace/Socket/Debug/Socket
08a29000-08a4a000 rw-p 00000000 00:00 0
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b776b000-b776d000 rw-p 00000000 00:00 0
b777a000-b777e000 rw-p 00000000 00:00 0
bfad2000-bfaf3000 rw-p 00000000 00:00 0

אני מאמין שאין צורך לבצע את שאר הבדיקות?

יש לך אולי רעיון נוסף למה זה יכול להיות?



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   21:25   20.01.12   
אל הפורום  
  11. ממש מוזר  
בתגובה להודעה מספר 10
 
   אתה אומר כאילו אתה עושה ממש
fopen
fclose
וקורס ממש ב fclose עוד לפני שעשית משהו בקובץ בכלל?

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   22:21   20.01.12   
אל הפורום  
  12. אחלה  
בתגובה להודעה מספר 11
 
   תודה רבה על העזרה !!

לגבי השאלה , כן אני עושה open וישר אחרי זה fclose וזה קורס , אנסה לפתוח שם שאלה , ושוב תודה רבה !!



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   00:19   21.01.12   
אל הפורום  
  13. בכיף  
בתגובה להודעה מספר 12
 
   הייתי מנסה עוד כמה דברים כדי עוד יותר להתמקד
1) מנסה לעבוד עם קובץ אחר, אולי איכשהו הקובץ הזה Corrupted
2) מנסה להריץ את הקוד לא על מכונה וירטאולית.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   00:40   21.01.12   
אל הפורום  
  14. נוסו כבר =]  
בתגובה להודעה מספר 13
 
   אני עובד לא על VM
וניסיתי את זה על עוד קבצים



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

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

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



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