Re: И снова сокеты
От: Phantom1982  
Дата: 01.12.06 09:05
Оценка:
Пишу программу на C# в VS2005 .NET

проблема с вторым и последующим клиентом.
запускаю сервер. подключчаюсь к нему. отправляю сообщение и сервер как положено разрывает рабочий сокет.
пробую подключиться заново mainSocket уже не отвечает.
в чем может быть проблема???

классы рабочей формы и сервера:

using System;
using System.Windows.Forms;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;

namespace Server
{
    public partial class Form1 : Form
    {
        private AsyncServer AServer = new AsyncServer();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AServer.OnRecived += new EventHandler(RecivedData);
            AServer.Start();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            AServer.Stop();
        }

        public void RecivedData()
        {
            AServer.SendData("You send: " + AServer.myData);
        }

    }

    // -S-E-R-V-E-R- - -S-O-C-K-E-T- - -C-L-A-S-S-

    public delegate void EventHandler();

    public class AsyncServer
    {

        private Socket mainSocket;
        private Socket workSocket;

        public string myData = "No Data";
        private byte[] buffer = new byte[256];

        public event EventHandler OnRecived;

        public class SocketPacket
        {
            public Socket Socket;
            public byte[] DataBuffer = new byte[256];
        }

        public void Start()
        {
            try
            {
                mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 12007);
                mainSocket.Bind(ipLocal);
                mainSocket.Listen(4);
                mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        private void OnClientConnect(IAsyncResult asyn)
        {
            try
            {
                workSocket = mainSocket.EndAccept(asyn);
                if (workSocket.Connected)
                    WaitForData();
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        private void WaitForData()
        {
            try
            {
                workSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
            }
            catch (SocketException se)
            {
            }
        }

        private void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                int iRx = 0;
                iRx = workSocket.EndReceive(asyn);
                char[] chars = new char[iRx + 1];
                Decoder d = Encoding.ASCII.GetDecoder();
                int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
                myData = new string(chars);
                OnRecived();
            }
            catch (SocketException se)
            {
            }
        }

        public void SendData(string msg)
        {
            try
            {
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(msg);
                workSocket.Send(byData);
                workSocket.Close();
            }
            catch (SocketException se)
            {
            }
        }

        public void Stop()
        {
            if (workSocket != null)
                workSocket.Close();
            if (mainSocket != null)
                mainSocket.Close();
        }

    }

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.