kerryjiang / SuperSocket

SuperSocket is a light weight, cross platform and extensible socket server application framework.
Apache License 2.0
3.93k stars 1.15k forks source link

使用HostedService扩展SuperSocketService再通过配置启动SuperSocket时,提示端口占用 #392

Closed kasnti closed 4 years ago

kasnti commented 4 years ago

beta6中出现该问题,beta3无问题 使用源码中samples里的ConfigSample项目案例,该案例在配置文件中写好了socket端口信息 在该案例中,新建CustomAppService类:

public class CustomAppService<TReceivePackageInfo> : SuperSocketService<TReceivePackageInfo>
    {
        public CustomAppService(IServiceProvider serviceProvider, IOptions<ServerOptions> serverOptions) : base(serviceProvider, serverOptions)
        {
        }

        protected override ValueTask OnSessionConnectedAsync(IAppSession session)
        {
            return base.OnSessionConnectedAsync(session);
        }
        protected override ValueTask OnSessionClosedAsync(IAppSession session)
        {
            return base.OnSessionClosedAsync(session);
        }

        protected override ValueTask<bool> OnSessionErrorAsync(IAppSession session, PackageHandlingException<TReceivePackageInfo> exception)
        {
            return base.OnSessionErrorAsync(session, exception);
        }
    }

在Program.cs中注册使用该服务(第二行,其余都是案例原本的代码):

var host = SuperSocketHostBuilder.Create<TextPackageInfo, LinePipelineFilter>(args)
                .UseHostedService<CustomAppService<TextPackageInfo>>()
                .UsePackageHandler(async (s, p) =>
                {
                    await s.SendAsync(Encoding.UTF8.GetBytes(p.Text + "\r\n"));
                })
                .ConfigureLogging((hostCtx, loggingBuilder) =>
                {
                    // register your logging library here
                    loggingBuilder.AddConsole();
                }).Build();

启动项目,提示端口重复占用

fail: TcpChannelCreator[0]
      The listener[Ip=Any, Port=4040, Security=None, Path=, BackLog=0, NoDelay=False] failed to start.
System.Net.Sockets.SocketException (10048): 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
   at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at SuperSocket.Server.TcpChannelCreator.Start()

已确认过并不是其他程序占用了端口,因为更换了beta3的包则无该问题

kerryjiang commented 4 years ago

This problem already has been fixed. But the fix has not been released to nuget. Anyway, you can get the fix from nightly build packages: https://www.myget.org/feed/Packages/supersocket

ArvGoodman commented 4 weeks ago

i can use net8 asp webapi , supersocket2.0 beta.26, find the same issue: 1.error message: TcpConnectionListener[0] The listener[Ip=Any, Port=9999, Security=None, Path=, BackLog=0, NoDelay=False] failed to start. System.Net.Sockets.SocketException (10048): Only one usage of each socket address (protocol/network address/port) is normally permitted. at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at SuperSocket.Server.Connection.TcpConnectionListener.Start()

2.source code: host = SuperSocketHostBuilder .Create<TextPackageInfo, LinePipelineFilter>() .ConfigureErrorHandler( (session, exception) => { _logger.LogError($"Tcp Error Handler: {exception.Message}"); return ValueTask.FromResult(false); } ) .ConfigureSuperSocket(opts => { foreach (var listener in _serverOptions.Value.Listeners) { opts.AddListener( new ListenOptions() { Ip = listener.Ip, Port = listener.Port } ); } }) .UseHostedService<CustomAppService>() // .UseSession() .UseClearIdleSession() .UseSessionHandler( onClosed: async (s, v) => { try { // Session管理 // await _gpsTrackerSessionManager.TryRemoveBySessionId(s.SessionID); } catch { // ignored } } ) .UsePackageHandler( async (s, packet) => { // 处理包 _logger.LogInformation($"rev:{packet.Text}"); } ) .UseInProcSessionContainer() .BuildAsServer();

await host.StartAsync();

ArvGoodman commented 4 weeks ago

could you have suggestion?

ArvGoodman commented 3 weeks ago

the reason is that serveroption part conflicts configuration json file with code serveroption setting .