[ 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(); } |