עבור לתוכן

C# reject connection befor accept

Featured Replies

פורסם

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

הדרך היחידה שמצאתי לבעיה היא בC++ ולכן היא לא רלוונטית וכל מי שניסה לשאול איך עושים זאת בC# קיבל סירוב קליל. אבל שוב יכול להיות שפספסתי משהו.

אז הנה קוד שבניתי הרגע בשבל הדוגמה ואני ממש מקווה שיש דרך שנותנת לי לבחור אם להסכים או לא להתקשרות של הלקוח איתי (צד השרת) לפני שהסכמתי לו. נגיד ויש לי רשימת IP בDB שאני מעוניין לסרב להתקשר אליהם ולכן אני לא רוצה לפתוח סתם חיבור ואחרי 2 שניות לסגור אותו.

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





Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Any, 8000));
listener.Listen(1);
Socket NewestSocket = listener.Accept();

אגב אם תתקל בחיפוש אחר הפתרון בנושא זה (שהוא היחיד):

http://stackoverflow.com/questions/1752219/rejecting-a-tcp-connection-before-its-being-accepted

הוא בC++ כי רק בC++ יש את הפעולות האלה שחיפשתי אותם בגוגל.

**אגב רשום בMSDN שהפעולה Listen שנמצאת במחלקת Socket יכולה לקבוע כמה חיבורים בו זמנית יכול הסוקט שלי לקבל. כי הרי ברור שאם זה חברה אז יש מצב שלפחות 2 מחשבים ינסו להתחבר לשרת בו זמנית אז לפי מה שהבנתי משם אז הסוקט שלי יסכים לשתי החיבורים בסופו של דבר הוא אחד אחד. עכשיו למה שאני רושם שם 0 אז הוא עדיין מקבל חיבורים? יכול להיות שלא הבנתי נכון את הפעולה? יש דרך אחרת לקבוע שהסוקט שלי יפסיק לקבל ניסיונות חיבור? בלי לסגור אותו?

תודה,

סתיו.

פורסם

לפי המידע שמצאתי, אפשר לעשות את זה רק ב-Win32 API, אבל לא בדוטנט.

ב-Win32 API יש פונקציה בשם WSAAccept שמקבילה ל-listener.Accept שאתה קורא לה, אבל גם מקבלת פונקציית Condition, שבה אתה יכול להחליט האם לקבל את החיבור או לא על פי הפרטים של הצד השני.

נראה שבמחלקה Socket של דוטנט אין את האופציה הזו משום מה, ככה שחייבים לאשר את החיבור ואז לסגור אותו...

פורסם
  • מחבר

מזה Win32 API ? שפות תכנות?בקיצור מה שאתה אומר שאין דרך לעשות זאת באמצעות הC#? בכל מקרה תודה על התשובה!

פורסם

Win32 API זה הממשק שדרכו תוכנות מדברות עם מערכת ההפעלה חלונות. הוא כתוב בשפת C, ולכן אפשר להשתמש בו ב-C וב-++C. הרבה מהמחלקות של דוטנט פשוט עוטפות חלקים מהממשק הזה (לדוגמה, Socket היא מחלקה כזו).

אפשר גם לקרוא לפונקציות של C מתוך #C, אבל אז אתה צריך גישה לתוכן של ה-Socket. אתה יכול לבקש מהסוקט את ה-Handle שלו ואז להעביר אותו לפונקציה WSAAccept, אבל כיוון ש-WSAAccept מחזיר Handle ואתה צריך אובייקט Socket לעבוד איתו, אין ממש מה לעשות עם זה (אי אפשר ליצור Socket מתוך ה-Handle שלו...)

ארכיון

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

דיונים חדשים