0

我有部署多个 Windows 服务的服务应用程序

static void Main()
        {
            DebugManager manager = new DebugManager();

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service1(),
                new Service2(),
                new Service3(),
                            };
            ServiceBase.Run(ServicesToRun);
        }

这是调试管理器

public class DebugManager : BaseDebug
    {
        private AsyncServer s;

        public DebugManager()
        {
            s = new AsyncServer(10000);
            s.Start();
        }

        public override void SendMessage(string message)
        {
            ts.SendMessage(message);
        }

       }

以及 Socket Server 本身

class AsyncServer
    {
        private Socket _serverSocket;
        private List<Socket> _clients;

        private int _port;
        byte[] buffer = new byte[255];

        public AsyncServer(int port) { _port = port; }

        public void Start()
        {
            try
            {
                _clients = new List<Socket>();
                SetupServerSocket();
                _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket);
            }
            catch(Exception ex)
            {
                EventLogManager.LogInformation(ex.ToString());
            }
        }

        private void SetupServerSocket()
        {
            try
            {
                IPHostEntry localMachineInfo = Dns.GetHostEntry(Dns.GetHostName());
                IPEndPoint myEndpoint = new IPEndPoint(localMachineInfo.AddressList[1], _port);
                _serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                _serverSocket.Bind(myEndpoint);
                _serverSocket.Listen((int)SocketOptionName.MaxConnections);
            }
            catch (Exception ex)
            {
                EventLogManager.LogInformation(ex.ToString());
            }
        }

        private void AcceptCallback(IAsyncResult result)
        {
            try
            {
                Socket s = (Socket)result.AsyncState;
                Socket socket = s.EndAccept(result);
                _clients.Add(socket);

                _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState);
            }
            catch (SocketException ex)
            {
                EventLogManager.LogInformation(ex.ToString());
            }
            catch (Exception ex)
            {
                EventLogManager.LogInformation(ex.ToString());
            }
        }

       public void SendMessage(string message)
        {
            try
            {
                byte[] bits = Encoding.UTF8.GetBytes(message);
                SocketAsyncEventArgs args = new SocketAsyncEventArgs();
                args.SetBuffer(bits, 0, bits.Length);

                foreach (var client in _clients)
                {
                    if (!client.Connected)
                    {
                        _clients.Remove(client);
                        continue;
                    }

                    try
                    {
                        client.SendAsync(args);
                    }
                    catch (Exception ex)
                    {
                        EventLogManager.LogInformation(ex.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                EventLogManager.LogInformation(ex.ToString());
            }
        }
    }

当我部署我的服务时,我的套接字服务器似乎没有启动或启动然后立即关闭。我的设计有什么问题,或者可能是我的代码?

4

1 回答 1

0

已经发现问题了。它是

private void SetupServerSocket()
        {
            try
            {
                IPHostEntry localMachineInfo = Dns.GetHostEntry(Dns.GetHostName());
                //Here is problem 
                IPEndPoint myEndpoint = new IPEndPoint(localMachineInfo.AddressList[1], _port);
                _serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                _serverSocket.Bind(myEndpoint);
                _serverSocket.Listen((int)SocketOptionName.MaxConnections);
            }
            catch (Exception ex)
            {
                EventLogManager.LogInformation(ex.ToString());
            }
        }

返回了几个地址,[1] 是 IPV6。将其更改为 InterNetwork 并且可以正常工作。我认为它以前可以工作,但我的客户端无法连接到服务器。

于 2013-03-29T06:59:55.240 回答