Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Net / System / Net / Sockets / TCPListener.cs / 1305376 / TCPListener.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Net.Sockets {
using System;
using System.Net;
using System.Security.Permissions;
///
/// The class provide TCP services at a higher level of abstraction than the
/// class. is used to create a host process that
/// listens for connections from TCP clients.
///
public class TcpListener {
IPEndPoint m_ServerSocketEP;
Socket m_ServerSocket;
bool m_Active;
bool m_ExclusiveAddressUse;
///
///
/// Initializes a new instance of the TcpListener class with the specified local
/// end point.
///
///
public TcpListener(IPEndPoint localEP) {
if(Logging.On)Logging.Enter(Logging.Sockets, this, "TcpListener", localEP);
if (localEP == null) {
throw new ArgumentNullException("localEP");
}
m_ServerSocketEP = localEP;
m_ServerSocket = new Socket(m_ServerSocketEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
if(Logging.On)Logging.Exit(Logging.Sockets, this, "TcpListener", null);
}
///
///
/// Initializes a new instance of the TcpListener class that listens to the
/// specified IP address and port.
///
///
public TcpListener(IPAddress localaddr, int port) {
if(Logging.On)Logging.Enter(Logging.Sockets, this, "TcpListener", localaddr);
if (localaddr == null) {
throw new ArgumentNullException("localaddr");
}
if (!ValidationHelper.ValidateTcpPort(port)) {
throw new ArgumentOutOfRangeException("port");
}
m_ServerSocketEP = new IPEndPoint(localaddr, port);
m_ServerSocket = new Socket(m_ServerSocketEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
if(Logging.On)Logging.Exit(Logging.Sockets, this, "TcpListener", null);
}
// implementation picks an address for client
///
///
/// Initiailizes a new instance of the TcpListener class
/// that listens on the specified
/// port.
///
///
///
[Obsolete("This method has been deprecated. Please use TcpListener(IPAddress localaddr, int port) instead. http://go.microsoft.com/fwlink/?linkid=14202")]
public TcpListener(int port){
if (!ValidationHelper.ValidateTcpPort(port))
throw new ArgumentOutOfRangeException("port");
m_ServerSocketEP = new IPEndPoint(IPAddress.Any, port);
m_ServerSocket = new Socket(m_ServerSocketEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
}
///
///
/// Used by the class to provide the underlying network socket.
///
///
public Socket Server {
get {
return m_ServerSocket;
}
}
///
///
/// Used
/// by the class to indicate that the listener's socket has been bound to a port
/// and started listening.
///
///
protected bool Active {
get {
return m_Active;
}
}
///
///
/// Gets the m_Active EndPoint for the local listener socket.
///
///
public EndPoint LocalEndpoint {
get {
return m_Active ? m_ServerSocket.LocalEndPoint : m_ServerSocketEP;
}
}
public bool ExclusiveAddressUse {
get {
return m_ServerSocket.ExclusiveAddressUse;
}
set{
if (m_Active) {
throw new InvalidOperationException(SR.GetString(SR.net_tcplistener_mustbestopped));
}
m_ServerSocket.ExclusiveAddressUse = value;
m_ExclusiveAddressUse = value;
}
}
public void AllowNatTraversal(bool allowed) {
if (m_Active) {
throw new InvalidOperationException(SR.GetString(SR.net_tcplistener_mustbestopped));
}
if (allowed) {
m_ServerSocket.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);
}
else {
m_ServerSocket.SetIPProtectionLevel(IPProtectionLevel.EdgeRestricted);
}
}
// Start/stop the listener
///
///
/// Starts listening to network requests.
///
///
public void Start() {
Start((int)SocketOptionName.MaxConnections);
}
public void Start(int backlog) {
if (backlog > (int)SocketOptionName.MaxConnections || backlog < 0) {
throw new ArgumentOutOfRangeException("backlog");
}
if(Logging.On)Logging.Enter(Logging.Sockets, this, "Start", null);
GlobalLog.Print("TCPListener::Start()");
if (m_ServerSocket == null)
throw new InvalidOperationException(SR.GetString(SR.net_InvalidSocketHandle));
//already listening
if (m_Active) {
if(Logging.On)Logging.Exit(Logging.Sockets, this, "Start", null);
return;
}
m_ServerSocket.Bind(m_ServerSocketEP);
try {
m_ServerSocket.Listen(backlog);
}
// When there is an exception unwind previous actions (bind etc)
catch (SocketException) {
Stop();
throw;
}
m_Active = true;
if(Logging.On)Logging.Exit(Logging.Sockets, this, "Start", null);
}
///
///
/// Closes the network connection.
///
///
public void Stop() {
if(Logging.On)Logging.Enter(Logging.Sockets, this, "Stop", null);
GlobalLog.Print("TCPListener::Stop()");
if (m_ServerSocket != null) {
m_ServerSocket.Close();
m_ServerSocket = null;
}
m_Active = false;
m_ServerSocket = new Socket(m_ServerSocketEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
if (m_ExclusiveAddressUse) {
m_ServerSocket.ExclusiveAddressUse = true;
}
if(Logging.On)Logging.Exit(Logging.Sockets, this, "Stop", null);
}
// Determine if there are pending connections
///
///
/// Determine if there are pending connection requests.
///
///
public bool Pending() {
if (!m_Active)
throw new InvalidOperationException(SR.GetString(SR.net_stopped));
return m_ServerSocket.Poll(0, SelectMode.SelectRead);
}
// Accept the first pending connection
///
///
/// Accepts a pending connection request.
///
///
public Socket AcceptSocket() {
if(Logging.On)Logging.Enter(Logging.Sockets, this, "AcceptSocket", null);
if (!m_Active)
throw new InvalidOperationException(SR.GetString(SR.net_stopped));
Socket socket = m_ServerSocket.Accept();
if(Logging.On)Logging.Exit(Logging.Sockets, this, "AcceptSocket", socket);
return socket;
}
// UEUE
///
/// [To be supplied.]
///
public TcpClient AcceptTcpClient() {
if(Logging.On)Logging.Enter(Logging.Sockets, this, "AcceptTcpClient", null);
if (!m_Active)
throw new InvalidOperationException(SR.GetString(SR.net_stopped));
Socket acceptedSocket = m_ServerSocket.Accept();
TcpClient returnValue = new TcpClient(acceptedSocket);
if(Logging.On)Logging.Exit(Logging.Sockets, this, "AcceptTcpClient", returnValue);
return returnValue;
}
//methods
[HostProtection(ExternalThreading=true)]
public IAsyncResult BeginAcceptSocket(AsyncCallback callback, object state)
{
if(Logging.On)Logging.Enter(Logging.Sockets, this, "BeginAcceptSocket", null);
if (!m_Active)
throw new InvalidOperationException(SR.GetString(SR.net_stopped));
IAsyncResult result = m_ServerSocket.BeginAccept(callback,state);
if(Logging.On)Logging.Exit(Logging.Sockets, this, "BeginAcceptSocket", null);
return result;
}
public Socket EndAcceptSocket(IAsyncResult asyncResult){
if(Logging.On)Logging.Enter(Logging.Sockets, this, "EndAcceptSocket", null);
if (asyncResult == null)
{
throw new ArgumentNullException("asyncResult");
}
LazyAsyncResult lazyResult = asyncResult as LazyAsyncResult;
Socket asyncSocket = lazyResult == null ? null : lazyResult.AsyncObject as Socket;
if (asyncSocket == null)
{
throw new ArgumentException(SR.GetString(SR.net_io_invalidasyncresult), "asyncResult");
}
// This will throw ObjectDisposedException if Stop() has been called.
Socket socket = asyncSocket.EndAccept(asyncResult);
if(Logging.On)Logging.Exit(Logging.Sockets, this, "EndAcceptSocket", socket);
return socket;
}
[HostProtection(ExternalThreading=true)]
public IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, object state)
{
if(Logging.On)Logging.Enter(Logging.Sockets, this, "BeginAcceptTcpClient", null);
if (!m_Active)
throw new InvalidOperationException(SR.GetString(SR.net_stopped));
IAsyncResult result = m_ServerSocket.BeginAccept(callback,state);
if(Logging.On)Logging.Exit(Logging.Sockets, this, "BeginAcceptTcpClient", null);
return result;
}
public TcpClient EndAcceptTcpClient(IAsyncResult asyncResult){
if(Logging.On)Logging.Enter(Logging.Sockets, this, "EndAcceptTcpClient", null);
if (asyncResult == null)
{
throw new ArgumentNullException("asyncResult");
}
LazyAsyncResult lazyResult = asyncResult as LazyAsyncResult;
Socket asyncSocket = lazyResult == null ? null : lazyResult.AsyncObject as Socket;
if (asyncSocket == null)
{
throw new ArgumentException(SR.GetString(SR.net_io_invalidasyncresult), "asyncResult");
}
// This will throw ObjectDisposedException if Stop() has been called.
Socket socket = asyncSocket.EndAccept(asyncResult);
if(Logging.On)Logging.Exit(Logging.Sockets, this, "EndAcceptTcpClient", socket);
return new TcpClient(socket);
}
}; // class TcpListener
} // namespace System.Net.Sockets
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OwnerDrawPropertyBag.cs
- ErrorHandler.cs
- ToolStripSplitStackLayout.cs
- SafeThemeHandle.cs
- IntellisenseTextBox.cs
- ServiceProviders.cs
- ConfigXmlSignificantWhitespace.cs
- Math.cs
- Stylesheet.cs
- SplineQuaternionKeyFrame.cs
- Helpers.cs
- XmlEntityReference.cs
- TabItemWrapperAutomationPeer.cs
- DependentTransaction.cs
- FixedElement.cs
- CatalogZoneBase.cs
- DesignerActionTextItem.cs
- EndpointAddressElementBase.cs
- Attributes.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- SchemaObjectWriter.cs
- FlowPosition.cs
- UniqueIdentifierService.cs
- CodeTypeReference.cs
- SocketManager.cs
- BindingCompleteEventArgs.cs
- InstallerTypeAttribute.cs
- MouseEvent.cs
- AssemblyAttributesGoHere.cs
- BadImageFormatException.cs
- MapPathBasedVirtualPathProvider.cs
- ApplicationHost.cs
- SiteMapNode.cs
- Privilege.cs
- Boolean.cs
- ExponentialEase.cs
- MultiDataTrigger.cs
- XmlSchemaSimpleContentRestriction.cs
- TextEditorSelection.cs
- HtmlToClrEventProxy.cs
- StylusTip.cs
- DataGridViewLinkColumn.cs
- XmlHierarchicalEnumerable.cs
- StorageMappingItemLoader.cs
- StylusPointPropertyInfo.cs
- DataGridViewControlCollection.cs
- Point.cs
- ReadOnlyDataSource.cs
- MenuItemStyleCollectionEditor.cs
- HtmlElementErrorEventArgs.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- LockCookie.cs
- externdll.cs
- DefaultShape.cs
- GregorianCalendar.cs
- CodeMemberMethod.cs
- Serializer.cs
- CommonDialog.cs
- DataBindingHandlerAttribute.cs
- ImageMap.cs
- DecoderNLS.cs
- Pts.cs
- VisualProxy.cs
- X509Certificate2.cs
- BrowserDefinitionCollection.cs
- ClosableStream.cs
- CustomError.cs
- BasicCellRelation.cs
- Reference.cs
- WindowsToolbarAsMenu.cs
- SqlCacheDependencySection.cs
- ScrollItemProviderWrapper.cs
- ShaperBuffers.cs
- ToolBarButtonClickEvent.cs
- NativeMethods.cs
- DesignerDataRelationship.cs
- BamlReader.cs
- CanonicalFontFamilyReference.cs
- SqlClientMetaDataCollectionNames.cs
- odbcmetadatacolumnnames.cs
- SortedSet.cs
- UInt32.cs
- StrongNameHelpers.cs
- ImageListImage.cs
- MarkerProperties.cs
- OleDbStruct.cs
- PropertyStore.cs
- BitmapData.cs
- RecordBuilder.cs
- MainMenu.cs
- RelationshipEndCollection.cs
- TracingConnection.cs
- DataSourceSelectArguments.cs
- CommandPlan.cs
- FileSecurity.cs
- DesignerInterfaces.cs
- PermissionSetTriple.cs
- AddingNewEventArgs.cs
- XmlWrappingWriter.cs
- FormView.cs