SuperSocket icon indicating copy to clipboard operation
SuperSocket copied to clipboard

2.0.2版本中,在.net core webapi 程序中启动多个服务器实例时,同时使用websocket 服务与udp 服务 出现启动失败,

Open w419894293 opened this issue 7 months ago • 2 comments

info: SuperSocketService[0] The listener [Ip=Any, Port=9995, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False] has been started. info: SuperSocketService[0] The listener [Ip=Any, Port=9996, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False] has been started. fail: UdpConnectionFactory[0] The listener[Ip=Any, Port=9995, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False] failed to start. System.Net.Sockets.SocketException (10048): 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 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.Udp.UdpConnectionListener.Start() fail: SuperSocketService[0] Failed to listen Ip=Any, Port=9995, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False. fail: UdpConnectionFactory[0] The listener[Ip=Any, Port=9996, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False] failed to start. System.Net.Sockets.SocketException (10048): 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 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.Udp.UdpConnectionListener.Start() fail: SuperSocketService[0] Failed to listen Ip=Any, Port=9996, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False. fail: SuperSocketService[0] Failed to start any listener. fail: Microsoft.Extensions.Hosting.Internal.Host[11] Hosting failed to start System.Exception: Failed to start the server. at SuperSocket.Server.SuperSocketService1.Microsoft.Extensions.Hosting.IHostedService.StartAsync(CancellationToken cancellationToken) at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>b__15_1(IHostedService service, CancellationToken token) at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List1 exceptions, Func3 operation) info: SuperSocketService[0] The listener [Ip=Any, Port=9996, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False] has been stopped. info: SuperSocketService[0] The listener [Ip=Any, Port=9995, AuthenticationOptions=, Path=, BackLog=0, NoDelay=False] has been stopped.

以下为注册两个服务实际代码:

builder.Host.AsSuperSocketHostBuilder<RawDataPackage>()
    .UseHostedService<UDPServer>()
    .UseSession<UDPServerSession>()
    .ConfigureServerOptions((ctx, config) => { return config.GetSection("UDPServer"); })
    .UsePipelineFilter<RawFilter>()
    .UsePackageHandler(ServerMethods.UdpDataPackageHandl)
    .UseUdp()
    .ConfigureHostBuilder();

builder.Host.AsWebSocketHostBuilder()
    .UseHostedService<WebSocketServer>()
    .UseSession<WebSocketServerSession>()
    .ConfigureServerOptions((ctx, config) => { return config.GetSection("WebSocketServer"); })
    .UsePipelineFilter<WebSocketPipelineFilter>()
    .UseWebSocketMessageHandler(ServerMethods.WebSocketDataPackageHandl)
    .ConfigureHostBuilder();

如果在以上代码中,单独使用udp 服务或者websocket 服务,则都可以正常运行,另外使用udp服务的方式,在多启动一个tcp服务也可以正常运行,但只要websocket与其它服务一起启动,则启动失败

w419894293 avatar Jul 21 '25 11:07 w419894293

麻烦大神帮忙看看,另外如果单独使用如下代码,则可以启动多个服务,但此种方式不是我想要的

MultipleServerHostBuilder.Create()
    .AddServer<TcpSocketServer, TCPDataPacket, TCPDataFilter>(builder =>
    {

        builder.ConfigureServerOptions((ctx, config) =>
        {
            return config.GetSection("TcpSocketServer");
        })      
        .UseSession<TCPSocketServerSession>()
        .UsePackageHandler(ServerMethods.TcpDataPackageHandl);
    })
    .AddWebSocketServer<WebSocketServer>(builder =>
    {
        builder.ConfigureServerOptions((ctx, config) =>
        {
            return config.GetSection("WebSocketServer");
        })    
        .UseSession<WebSocketServerSession>()
        .UseWebSocketMessageHandler(ServerMethods.WebSocketDataPackageHandl);
    })
    .Build()
    .RunAsync();

w419894293 avatar Jul 21 '25 11:07 w419894293

Try setup host like this:

https://github.com/kerryjiang/SuperSocket/blob/9bd01414ecdeb635dae65bb06b06dd6d812f50ed/test/SuperSocket.Tests/MainTest.cs#L493-L571

kerryjiang avatar Aug 08 '25 02:08 kerryjiang