[ Marko Medojević @ 21.01.2009. 16:28 ] @
Ćao!

Imam jednu klijent i server aplikaciju. Klijent ima dugme za konektovanje, dugme za slanje i tekst boks. On se povezuje na server i šalje mu string. Server ima rich tekst boks i u njega prihvata string.
Slanje stringova radi kako treba, međutim javlja se problem kada hoću da diskonektujem klijent sa servera. Ne znam kako zatvorim soket na strani klijenta a da server detektuje da sam to u radio! Probao sam u okviru klijenta da pozovem metode "glavniSoket.Disconnect(false);" ili "glavniSoket.Close();", ali kada u okviru servera izvrsim "komunikacioniSoket.Connected;" dobijam i dalje "true". Jedino sto mi se prilikom diskonektovanja na strani klijenta procesor zakuca na 100%.

Kod klijenta:
Code:

Socket glavniSoket;

public Form1()
{
     InitializeComponent();
}

private void btnConnect_Click(object sender, EventArgs e)
{
     IPEndPoint destinacija = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8221);
     glavniSoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     glavniSoket.Connect(destinacija);
}

private void btnSalji_Click(object sender, EventArgs e)
{
     NetworkStream ns = new NetworkStream(glavniSoket);
     byte[] komandaBuffer = Encoding.Unicode.GetBytes(textBox1.Text);
     byte[] buffer = new byte[4];
     buffer = BitConverter.GetBytes(komandaBuffer.Length);
     ns.Write(buffer, 0, 4);
     ns.Flush();
     ns.Write(komandaBuffer, 0, komandaBuffer.Length);
     ns.Flush();
     ns.Close();
}


private void btnDisconnect_Click(object sender, EventArgs e)
{
     glavniSoket.Disconnect(false);
}


Kod servera:
Code:

int readBytes;
int senderNameSize;
string senderName;
byte[] buffer;
Socket glavniSoket;
Socket komunikacioniSoket;

public Form1()
{
     InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
     IPEndPoint destinacija = new IPEndPoint(IPAddress.Any, 8221);
     glavniSoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     glavniSoket.Bind(destinacija);
     glavniSoket.Listen(10);
     komunikacioniSoket = glavniSoket.Accept();

     primanje();
}

public void primanje()
{
     richTextBox1.Text += komunikacioniSoket.Connected;
     NetworkStream networkStream = new NetworkStream(komunikacioniSoket);
     buffer = new byte[4];
     IAsyncResult rezultat = networkStream.BeginRead(buffer, 0, 4, new AsyncCallback(completeReadLength), networkStream);
}

public void completeReadLength(IAsyncResult rezultat)
{
     NetworkStream networkStream = (NetworkStream)rezultat.AsyncState;
     readBytes = networkStream.EndRead(rezultat);
     senderNameSize = BitConverter.ToInt32(buffer, 0);


     buffer = new byte[senderNameSize];
     rezultat = networkStream.BeginRead(buffer, 0, senderNameSize, new AsyncCallback(completeReadString), networkStream);
}

public void completeReadString(IAsyncResult rezultat)
{
     NetworkStream networkStream = (NetworkStream)rezultat.AsyncState;

     readBytes = networkStream.EndRead(rezultat);
     senderName = System.Text.Encoding.Unicode.GetString(buffer);
     richTextBox1.Text = senderName;

     networkStream.Close();

     primanje();
}