עבור לתוכן

socket ב-C#

Featured Replies

פורסם

אני בדיוק לומד (לבד) של סוקטים עלמנת להבין יותר ומצאתי ברשת ספר של סוקטים ב-C#

הספר כולל דוגמאות קוד עם הסברים, באחד הדוגמאות הראשונות יש קוד מסויים שנופל לי במחשב על השורה הראשונה

זה תחילת ה-MAIN שלי ובתוך ה-if הוא נופל:


static void Main(string[] args)
{
if ((args.Length < 2) || (args.Length > 3))
{
// Test for correct # of args
throw new ArgumentException("Parameters: <Server> <Word> [<Port>]");
}

אשמח להסבר מה זה בדיוק ה-args הזה ולמה זה נופל לי

פורסם

רצוי שתלמד קצת תכנות בסיסי לפני שאתה רץ ללמוד סוקטים.

לכל תוכנית יש את הנקודת כניסה (Entry point) הפונקציה הראשונה שרצה כשאתה מריץ אותה.

המוסכמה כמעט בכל שפת תכנות היא להשתמש בפונקציה סטטית בשם Main (כתלות בשפה היא עשויה להחזיר פרמטר או לא)

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

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

אם אתה עובד עם C# לך להגדרות של הפרוייקט אם אני לא טועה תחת Debugger או compiler אמור להיות לך מקום לספק פרמטרים.

פורסם
  • מחבר

אני יודע תיכנות בסיסי אבל את זה לא ממש לימדו אותנו

איפה אני משנה את ה שהסברת לי ? לא ממש מצאתי מה בדיוק לשנות

תודה רבה !

פורסם

חפש בהגדרות של הפרוייקט משהו שנקרא Command Line Arguments. זו פשוט מחרוזת שמכילה את הארגומנטים שמועברים לתכנית (כל מילה נכנסת לתא במערך args).

פורסם
  • מחבר

אוקיי מצאתי ומה בדיוק אני אמור לשים בתיבה שם ? (היא ריקה)

פורסם

מה שהתכנית מצפה לקבל.

אין הסבר כלשהו על דוגמת הקוד הזו?

ניסית לקרוא את הקוד ולהבין מה כתוב שם?

(חוץ מזה, מי הדביל שזורק Exception מה-main? מאיפה הקוד הזה?)

וכמו שאמרו - תדאג ללמוד דברים בסיסיים יותר לפני שאתה קופץ לסוקטים. דברים כמו Command Line Arguments הם בסיסיים.

נ.ב. שנה את הכותרת בבקשה. אין קשר בינה לבין הנושא.

פורסם
  • מחבר

על השורה הראשונה הזו רק מוסבר: Application setup and parameter parsing

זה כל הקוד:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net.Sockets;




namespace TcpEchoServer
{
class TcpEchoClient
{
static void Main(string[] args)
{
if ((args.Length < 2) || (args.Length > 3))
{
// Test for correct # of args
//throw new ArgumentException("Parameters: <Server> <Word> [<Port>]");
}


String server = args[0]; // Server name or IP address
byte[] byteBuffer = Encoding.ASCII.GetBytes(args[1]); // Convert input String to bytes
int servPort = (args.Length == 3) ? Int32.Parse(args[2]) : 7; // Use port argument if supplied, otherwise default to 7
TcpClient client = null;
NetworkStream netStream = null;


try
{
client = new TcpClient(server, servPort); // Create socket that is connected to server on specified port
Console.WriteLine("Connected to server... sending echo string");
netStream = client.GetStream();
netStream.Write(byteBuffer, 0, byteBuffer.Length); // Send the encoded string to the server
Console.WriteLine("Sent {0} bytes to server...", byteBuffer.Length);
int totalBytesRcvd = 0; // Total bytes received so far
int bytesRcvd = 0; // Bytes received in last read


while (totalBytesRcvd < byteBuffer.Length) // Receive the same string back from the server
{
if ((bytesRcvd = netStream.Read(byteBuffer, totalBytesRcvd, byteBuffer.Length - totalBytesRcvd)) == 0)
{
Console.WriteLine("Connection closed prematurely.");
break;
}


totalBytesRcvd += bytesRcvd;
Console.WriteLine("Received {0} bytes from server: {1}", totalBytesRcvd, Encoding.ASCII.GetString(byteBuffer, 0, totalBytesRcvd));
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}


finally
{
netStream.Close();
client.Close();
}


Console.ReadLine();
}
}
}

פורסם

שים לב מה כתוב בשגיאה שהוא זורק.

ושוב:

נ.ב. שנה את הכותרת בבקשה. אין קשר בינה לבין הנושא.

פורסם
  • מחבר

הוא נופל על Object reference not set to an instance of an object.

בשורה

client = new TcpClient(server, servPort);

והוא רושם בחלון קונסול את ההודעה הבאה שאני לא מבין מה זה אומר:

No connection could be made because the target machine actively refused it [2001

:0:4137:9e76:81c:299e:e057:cf2d]:7

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

פורסם

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

well, duh... ציפית שהוא ינחש מה אתה רוצה?

ניסית לקרוא את הקוד ולהבין מה כתוב שם?

מה כתוב בשורה שהפכת להערה? בדרך כלל כשיש שגיאה בתכנית לא מתעלמים ממנה, מנסים להבין מה היא אומרת ואיך גורמים לכך שהיא לא תקרה.

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

פורסם
  • מחבר

אני רואה שאני צריך איזשהו server על המחשב עלמנת שיענה לקליינט, השאלה היא האם יש איזה קוד מוכן כבר של server שרק יעשה ECHO

פורסם
  • מחבר

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

פורסם

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

אם היית טורח להמשיך לקרוא את הספר היית רואה שמיד אחרי הקוד של הלקוח מופיע הקוד של השרת.

פורסם
  • מחבר
:kopfpatsch:

ארכיון

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

דיונים חדשים