mirror of
https://github.com/inthehand/32feet.git
synced 2026-10-20 23:56:14 +08:00
138 lines
2.8 KiB
C#
138 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Net.Sockets;
|
|
using System.Net;
|
|
|
|
class TestSocketSocketPairFactory : ISocketPairFactory
|
|
{
|
|
ITestSocketPair ISocketPairFactory.CreateSocketPair()
|
|
{
|
|
return new TestSocketPair();
|
|
}
|
|
|
|
bool ISocketPairFactory.SocketSupportsCloseInt32 { get { return true; } }
|
|
bool ISocketPairFactory.SocketSupportsShutdown { get { return true; } }
|
|
}
|
|
|
|
class TestSocketPair : ITestSocketPair
|
|
{
|
|
Socket m_svr;
|
|
ISocketWrapper m_cli;
|
|
|
|
public TestSocketPair()
|
|
{
|
|
Create();
|
|
}
|
|
|
|
public ISocketWrapper SocketA
|
|
{
|
|
get { return m_cli; }
|
|
}
|
|
|
|
public NetworkStream StreamA
|
|
{
|
|
get
|
|
{
|
|
return m_cli.GetStream();
|
|
}
|
|
}
|
|
|
|
public Socket SocketB
|
|
{
|
|
get { return m_svr; }
|
|
}
|
|
|
|
void ITestSocketPair.PeerSendsData(byte[] data)
|
|
{
|
|
Socket peer = SocketB;
|
|
peer.Send(data);
|
|
}
|
|
|
|
void ITestSocketPair.PeerCloses()
|
|
{
|
|
Socket peer = SocketB;
|
|
peer.Close();
|
|
}
|
|
|
|
//----
|
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
|
|
internal void Create()
|
|
{
|
|
try {
|
|
Create(AddressFamily.InterNetworkV6);
|
|
} catch {
|
|
Create(AddressFamily.InterNetwork);
|
|
}
|
|
}
|
|
|
|
private void Create(AddressFamily af)
|
|
{
|
|
using (Socket lstnr = new Socket(af, SocketType.Stream, ProtocolType.Unspecified)) {
|
|
lstnr.Bind(new IPEndPoint(
|
|
af == AddressFamily.InterNetworkV6 ? IPAddress.IPv6Loopback : IPAddress.Loopback, 0));
|
|
lstnr.Listen(1);
|
|
EndPoint svrEp = lstnr.LocalEndPoint;
|
|
Socket cli = new Socket(svrEp.AddressFamily, lstnr.SocketType, lstnr.ProtocolType);
|
|
cli.Connect(svrEp);
|
|
m_cli = new SocketWrapper(cli);
|
|
m_svr = lstnr.Accept();
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(true);
|
|
}
|
|
|
|
private void Dispose(bool disposing)
|
|
{
|
|
if (disposing) {
|
|
m_cli.Close();
|
|
m_svr.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
class SocketWrapper : ISocketWrapper
|
|
{
|
|
Socket m_sock;
|
|
NetworkStream m_strm;
|
|
|
|
public SocketWrapper(Socket sock)
|
|
{
|
|
m_sock = sock;
|
|
}
|
|
|
|
//----
|
|
bool ISocketWrapper.Connected
|
|
{
|
|
get { return m_sock.Connected; }
|
|
}
|
|
|
|
NetworkStream ISocketWrapper.GetStream()
|
|
{
|
|
if (m_strm == null) {
|
|
m_strm = new NetworkStream(m_sock, true);
|
|
}
|
|
return m_strm;
|
|
}
|
|
|
|
//----
|
|
|
|
void ISocketWrapper.Close()
|
|
{
|
|
m_sock.Close();
|
|
}
|
|
|
|
void ISocketWrapper.Close(int timeout)
|
|
{
|
|
m_sock.Close(timeout);
|
|
}
|
|
|
|
void ISocketWrapper.Shutdown(SocketShutdown how)
|
|
{
|
|
m_sock.Shutdown(how);
|
|
}
|
|
}
|