1 // Licensed to the Apache Software Foundation(ASF) under one
2 // or more contributor license agreements.See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership.The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License. You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied. See the License for the
15 // specific language governing permissions and limitations
20 using System.Net.Sockets;
21 using System.Threading;
22 using System.Threading.Tasks;
23 using Thrift.Transports.Client;
25 namespace Thrift.Transports.Server
27 // ReSharper disable once InconsistentNaming
28 public class TServerSocketTransport : TServerTransport
30 private readonly int _clientTimeout;
31 private readonly int _port;
32 private readonly bool _useBufferedSockets;
33 private readonly bool _useFramedTransport;
34 private TcpListener _server;
36 public TServerSocketTransport(TcpListener listener)
41 public TServerSocketTransport(TcpListener listener, int clientTimeout)
44 _clientTimeout = clientTimeout;
47 public TServerSocketTransport(int port)
52 public TServerSocketTransport(int port, int clientTimeout)
53 : this(port, clientTimeout, false)
57 public TServerSocketTransport(int port, int clientTimeout, bool useBufferedSockets):
58 this(port, clientTimeout, useBufferedSockets, false)
62 public TServerSocketTransport(int port, int clientTimeout, bool useBufferedSockets, bool useFramedTransport)
65 _clientTimeout = clientTimeout;
66 _useBufferedSockets = useBufferedSockets;
67 _useFramedTransport = useFramedTransport;
71 _server = new TcpListener(IPAddress.Any, _port);
72 _server.Server.NoDelay = true;
77 throw new TTransportException("Could not create ServerSocket on port " + port + ".");
81 public override void Listen()
83 // Make sure not to block on accept
90 catch (SocketException sx)
92 throw new TTransportException("Could not accept on listening socket: " + sx.Message);
97 public override bool IsClientPending()
99 return _server.Pending();
102 protected override async Task<TClientTransport> AcceptImplementationAsync(CancellationToken cancellationToken)
104 if (cancellationToken.IsCancellationRequested)
106 return await Task.FromCanceled<TClientTransport>(cancellationToken);
111 throw new TTransportException(TTransportException.ExceptionType.NotOpen, "No underlying server socket.");
116 TClientTransport tSocketTransport = null;
117 var tcpClient = await _server.AcceptTcpClientAsync();
121 tSocketTransport = new TSocketClientTransport(tcpClient)
123 Timeout = _clientTimeout
126 if (_useBufferedSockets)
128 tSocketTransport = new TBufferedClientTransport(tSocketTransport);
131 if (_useFramedTransport)
133 tSocketTransport = new TFramedClientTransport(tSocketTransport);
136 return tSocketTransport;
140 if (tSocketTransport != null)
142 tSocketTransport.Dispose();
144 else // Otherwise, clean it up ourselves.
146 ((IDisposable) tcpClient).Dispose();
154 throw new TTransportException(ex.ToString());
158 public override void Close()
168 throw new TTransportException("WARNING: Could not close server socket: " + ex);