PDA

View Full Version : سوال: ساخت کلاس برای سوکت پروگرمینگ socket programing



dashti011
چهارشنبه 05 آذر 1393, 01:07 صبح
سلام دوستان
من قبلا یک کد نوشته بودم برای اتصال به سوکت شبکه ( و وایرلس) به صورت TCP و به خوبی هم جواب میداد.
تصمیم گرفتم اونو به صورت کلاس بنویسم تا راحت تر استفاده کنم من دو تا متد توی کلاس Socket دارم که متد اولی به نام connect برای باز کردن سوکت وبرقرای ارتباط است و متد دومی به نام senddata برای ارسال اطلاعات البته در صورتیکه سوکت ساخته شده باشد . مشکلی که دارم این که وقتی شی سوکت به نام server را توی متد Connect میسازم و ارتباط برقرار میشه برای ارسال در متد Senddata به شی سوکت به نام server دسترسی ندارم . ممنون میشم راهنماییم کنید.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace reverse1
{
class socket
{
private string resulat;
bool connected = false;
public string connect(string ip,string port)
{
IPAddress host = IPAddress.Parse(ip);
int portinput = int.Parse(port);
IPEndPoint ipep = new IPEndPoint(host, portinput);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


try
{
server.Connect(ipep);
// "اتصال با موفقیت صورت گرفت ";
resulat = "Connect successfully";
connected = true;
return resulat;
}
catch (SocketException ex)
{
// Console.WriteLine("Unable to connect to server.");
resulat = (ex.ToString());
connected = false;
return resulat;
}
}

public bool Senddata(string datatext)
{
if (connected)
{
byte[] data = new byte[2048];

string welcome = datatext;
// string welcome = richTextBox1.Text;
data = Encoding.Unicode.GetBytes(welcome);
// در خط زیر نمتونم به شی سرور دسترسی داشته باشم
server.Send(data, data.Length, SocketFlags.None);

return true;
}
else
{
return false;
}
}
}
}






البته کلاس من هنوز کامل نشده و بخش دریافت اطلاعات مونده تا تکمیل کنم . با تشکر از دوستان :لبخند:

dashti011
چهارشنبه 05 آذر 1393, 01:19 صبح
تو لینک زیر توضیحات خوبی دیدم و سعی میکنم کد نهایی کامل را همین جا بذارم
http://msdn.microsoft.com/en-us/library/system.net.sockets.socket%28v=vs.110%29.aspx



یک مشکل اینکه من برای ارسال هر دفعه اطلاعات از نو سوکت را گانفیگ میکنم و اطلاعات را میفرستیم با این که ظاهرا مشکلی پیش نمیاد منتها میدونم این کار اصولی نیست . دوستان میشه کمک کنن تا کلاس را جوری بنویسم تا سوکت فقط یکبار ساخته بشه و در دفعات بعدی فقط اطلاعات را روی سوکت بذارم و بفرستم ؟! تا این که سوکت را خاموش کنم و ببندم.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace reverse1
{
class socket
{

public static bool connect(string ip, string port,string Senddata)
{
string resulat;

byte[] data = new byte[2048];
IPAddress host = IPAddress.Parse(ip);
int portinput = int.Parse(port);
IPEndPoint ipep = new IPEndPoint(host, portinput);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


try
{
server.Connect(ipep);
// "اتصال با موفقیت صورت گرفت ";
resulat = "Connect";

string welcome = Senddata;
// string welcome = richTextBox1.Text;
data = Encoding.Unicode.GetBytes(welcome);
// شی سرور

server.Send(data, data.Length, SocketFlags.None);

// return true;

return true;
}
catch (SocketException ex)
{
// Console.WriteLine("Unable to connect to server.");
resulat = (ex.ToString());

return false;
}
}

}
}


کد زیر هم تو فرم اصلی برای دکمه button1 گذاشتم



if (string.IsNullOrWhiteSpace(txtip.Text) || string.IsNullOrWhiteSpace(txtport.Text))
{
System.Windows.Forms.MessageBox.Show(" please enter both of Ip and Port");
return;

}
bool run = socket.connect(txtip.Text, txtport.Text, txtfinal.Text);
if (run)
{

// MessageBox.Show("Connet succesfully");

}
else
{

MessageBox.Show("faild");

}

dashti011
جمعه 07 آذر 1393, 15:46 عصر
سلام هر چند دوستانی تمایلی به مشارکت نداشتند منتها کد نهایی را همون طور که میخواستم نوشتم و براتون میذارم شاید مفید باشه

کد مربوط به کلاس سوکت :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace reverse1
{
public class socket
{
private static Socket ConnectSocket(string server, int port)
{
Socket s = null;
IPAddress host = IPAddress.Parse(server);
// int portinput = int.Parse(port);
IPEndPoint ipe = new IPEndPoint(host, port);
Socket tempSocket =
new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
tempSocket.Connect(ipe);
}
catch
{

}


if (tempSocket.Connected)
{
s = tempSocket;

}
else
{
//EROOR
}
return s;
//////////////////////////
}
public static bool SocketSendReceive(string server, int port,string text)
{
Socket s = ConnectSocket(server, port);

Byte[] bytesSent = Encoding.Unicode.GetBytes(text);
//Byte[] bytesReceived = new Byte[256];

// Create a socket connection with the specified server and port.
// Socket s = ConnectSocket(server, port);

if (s == null)
// return ("Connection failed");
return false;

// Send request to the server.
s.Send(bytesSent, bytesSent.Length, 0);
return true;
// return ("ok");
}

}
}


کد مربوط به استفاده کلاس :



private void btnboth_Click(object sender, EventArgs e)
{

sendsocket();

}



private void sendsocket()
{
if (string.IsNullOrWhiteSpace(txtip.Text) || string.IsNullOrWhiteSpace(txtport.Text))
{
System.Windows.Forms.MessageBox.Show(" please enter both of Ip and Port");
return;

}
bool run = socket.SocketSendReceive(txtip.Text, int.Parse(txtport.Text), txtfinal.Text);

if (run)
{

// MessageBox.Show("Connet succesfully");

}
else
{

MessageBox.Show("قادر به برقرای ارتباط با سیستم نمیباشد");

}
}





تکست باکس txtfinal مربوط به متن ارسالی و تکست باکس txtip مربوط به ای پی سرور و txtport مربوط به پورت سرور هست.
یاعلی

managment-barnamenevis
سه شنبه 28 بهمن 1393, 18:00 عصر
سلام خدمت دوستان عزیز
من یه قطعه کد سوکت پروگرمینگ دارم مربوط به محیط کنسول
از دوستان میخواستم سوال کنم ببینم کسی میتونه کمک کنه تا این کد و تغییر داد تا بشه داخل محیط فرم ازش استفاده کنیم
منون

managment-barnamenevis
سه شنبه 28 بهمن 1393, 18:01 عصر
class Program
{
static void Main(string[] args)
{
String input;
Byte[] data = new Byte[1024];
int recv;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
newsocket.Bind(ipep);
newsocket.Listen(10);
Console.WriteLine("please waite");
Socket client = newsocket.Accept();
client.Send(Encoding.ASCII.GetBytes("khosh vaydi gerdelom"));
while (true)
{

recv = client.Receive(data);
if (recv == 0)
break;
input = Console.ReadLine();
client.Send(Encoding.ASCII.GetBytes(input));
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
client.Send(data, recv, SocketFlags.None);

}
newsocket.Close();
client.Close();