پیرو پ.خ. زیر (البته با اجازه خودشون) :
نوشته شده توسط
hamidhws
... چیزی که هنوز درست متوجه نشدم اینه که فرمودید واسه اینکه بفهمیم کلاینتمون به سرور وصل شده از connected استفاده کنیم , که یک مقدار bool برمیگردونه . یعنی من باید اینو توی تایمر بذارم و لحظه به لحظه چک کنم؟
ما توی event , winsock هایی داشتیم مثل connected یا disconnected,... که میتونستیم کدهامونو توش بریزیم تا زمان رخ دادن event اجرا بشه اما توی این کلاس دات نت من event ی ندیدم .میشه توضیح بدید این قسمت به چه صورته؟ ...
شما پرسیدین System.Net.Sockets.TcpClient مثل winsock همچین چیزی داره یا نه؟ ("چه زمانی کانکشن وصل میشه ؟") من هم گفتم بلی (connected) ولی اینکه این به چه درد شما میخوره، من که نمیدونم کدتون به چه صورت هست! (مثلاً دوست دارین خودتون یه Event واسش بنویسین و چرخ رو از اول اختراع کنید!) تو راه حل عمومی معمولاً ازش استفاده نمیشه، از چی استفاده میشه؟ Again:
==============
چون معمولاً بعیده حالت سنکرون (Synchronous) بدرد کسی بخوره و بیشتر تو P2P کاربرد داره و از طرف دیگه مفهوم پیچیده ای توش نیست، من حالت عمومی موردنیاز رو توضیح میدم (توضیح داده ام و خواهم داد!) تو حالت Asynchronous شما لازم نیست دنبال event بگردین؛ اگه یه نگاهی به مثال که دادم مینداختین، همونطورکه گفتم شما BeginConnect میکنید و اونجا بهش یک AsyncCallback پاس میدین، اون همه کارها رو میکنه! کدش :
public static void Connect(EndPoint remoteEP, Socket client) {
client.BeginConnect(remoteEP,
new AsyncCallback(ConnectCallback), client );
connectDone.WaitOne();
}
حالا delegate (همون AsyncCallback که بالا پاس دادین یعنی ConnectCallback) شما بطور اتوماتیک هروقت Remote device شما در دسترس باشه (بقول شما event های مثل connected یا disconnected,... رخ بدن)، فراخوانی میشه و شما میتونید "کدهاتونو توش بریزین تا زمان رخ دادن event اجرا بشن" بعدش هم می تونید مثلاً به Application بگین که کارم تموم شد، تو هم برو پی کارت! اینطوری مثلاً:
private static void ConnectCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket client = (Socket) ar.AsyncState;
// Complete the connection.
client.EndConnect(ar);
Console.WriteLine("Socket connected to {0}",
client.RemoteEndPoint.ToString());
// Signal that the connection has been made.
connectDone.Set();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
Send و Receive هم تقریباً یه همچین روالی دارن و براحتی میتونید با تعریف یک AsyncCallback براشون تمام کارهایی رو که میخواین انجام بدین، این باعث میشه کارهای موردنظرتون در Delegate شما، بدون زحمت و دردسر اینکه کلاینت Connect هست یا ایوای وسط کار DC شد و ... انجام بگیره.
برای توضیحات بیشتر، لینک که دادم (Using an Asynchronous Client Socket) رو بخونین.
موفق باشید.