בעיה ב- connect ל- socket

nechamaf

New member
בעיה ב- connect ל- socket

אני מבצעת את קטע הקוד הבא: if ((sock_fd=socket(AF_UNIX,SOCK_STREAM,0))<0) { perror("error in socket creation"); exit(errno); } if (connect(sock_fd,(struct sockaddr *)&server_name,sizeof(server_name))< 0) { perror("error in connection to socket"); exit(errno); } ומקבלת את ההודעה: error in connection to socket: No such file or directory איפה הטעות?
 

voguemaster

New member
הערות שאולי יעזרו:

1. ראשית, עדיף להשתמש ב-AF_LOCAL ולא ב-AF_UNIX. זה לשם הסטנדרט
2. כל unix domain socket מקושרת ל"קובץ" ב-filesystem. כלומר, כדי להתחבר ל-unix socket כלשהו צריך שקודם כל יהיה שרת כלשהו שביצע את הפעולות הבאות:
#define SA struct sockaddr char pathname = "/home/blabla/foo.bar"; // just an example of a file on blabla's home directory listenfd = socket( AF_LOCAL, SOCK_STREAM, 0); // create a pipe bzero( &servadd, sizeof( servaddr)); servadd.sun_family = AF_LOCAL; strncpy( servaddr.sun_path, pathname, sizeof( servaddr.sun_path)-1); bind( listenfd, (SA *) &servaddr, sizeof( servaddr)); listen( listenfd, 5); // backlog value of 5, change to whatever u need . . .​
(לא בדקתי את הערכים המוחזרים אבל הרעיון ברור לך אני מקווה
. 3. אחרי שיש socket שמקושרת לנתיב כלשהו אפשר לנסות להתחבר אליה בצורה שניסית. 4. אני לא זוכר כבר אבל יש את המקרו SUN_LEN שאמור להחזיר את הגודל של ה-struct (כמה תפוס מתוכו). יכול להיות שצריך להשתמש בו במקום ב-sizeof בקריאה ל-bind בשרת.. שוב, לא סגור על זה. יכול להיות שלא ממש צריך כי sizeof בכל מקרה מחזיר תוצאה גדולה יותר (את האורך המלא
) 5. תבדקי את ה-permissions לקובץ שבחרת. 6. תבדקי שהנתיב הוא אבסולוטי. הסטנדרט דורש את זה אחרת יש התנהגות לא מוגדרת. לכן, הנתיב "????????????" אצלך נראה לי קצת... מוזר
. לא ידוע לי על אפשרות ליצור קובץ שנקרא "?????????" בלי קידומת של נתיב לפניו. 7. כמו שאמרתי, תוודאי שהנתיב קושר ע"י bind ל-unix socket ע"י שרת כלשהו. 8. אם הנתיב קיים אבל לא מקושר ל-unix socket, ניסיון ההתחברות ייכשל. 9. אין file descriptor שמשויך ל-socket. 10. סוג ה-unix socket שונה מזה שאת צריכה (לדוגמא SOCK_DGRAM ו-SOCK_STREAM לא הולכות ביחד). אני ממליץ לך לשנות את הנתיב לנתיב אבסולוטי, איפשהו במחיצת הבית שלך או במקום ידוע אחר ולנסות שוב. כמובן, את צריכה שרת שיעשה bind לנתיב הזה לפני שאת יכולה לבצע connect כלשהו. כמו כן, עדיף לעבוד עם strncpy מאשר עם memcpy.
 
למעלה