2 using System
.Collections
.Generic
;
4 using System
.Net
.Sockets
;
10 public class WvSockStream
: WvStream
13 protected Socket sock
{
20 _sock
.Blocking
= false;
24 public override bool ok
{
25 get { return (sock != null) && base.ok; }
28 public WvSockStream(Socket sock
)
33 public override EndPoint localaddr
{
37 return sock
.LocalEndPoint
;
41 public override EndPoint remoteaddr
{
45 return sock
.RemoteEndPoint
;
49 public override int read(WvBytes b
)
56 int ret
= sock
.Receive(b
.bytes
, b
.start
, b
.len
, 0);
66 catch (SocketException e
)
68 if (e
.ErrorCode
== 10004) // EINTR is normal when non-blocking
70 else if (e
.ErrorCode
== 10035) // EWOULDBLOCK too
75 // err = new Exception(wv.fmt("Error code {0}\n", e.ErrorCode));
81 public override int write(WvBytes b
)
88 int ret
= sock
.Send(b
.bytes
, b
.start
, b
.len
, 0);
89 if (ret
< 0) // Unexpected error
91 err
= new Exception(wv
.fmt("Write error #{0}", ret
));
97 catch (SocketException e
)
99 if (e
.ErrorCode
== 10004) // EINTR is normal when non-blocking
101 else if (e
.ErrorCode
== 10035) // EWOULDBLOCK too
106 // err = new Exception(wv.fmt("Error code {0}\n", e.ErrorCode));
112 public override event Action onreadable
{
113 add { base.onreadable
+= value;
114 if (ok
) ev
.onreadable(sock
, do_readable
); }
115 remove { base.onreadable
-= value;
116 if (!can_onreadable
) ev
.onreadable(sock
, null); }
119 public override event Action onwritable
{
120 add { base.onwritable
+= value;
121 if (ok
) ev
.onwritable(sock
, do_writable
); }
122 remove { base.onwritable
-= value;
123 if (!can_onwritable
) ev
.onwritable(sock
, null); }
126 void tryshutdown(SocketShutdown sd
)
132 catch (SocketException
)
138 public override bool wait(int msec_timeout
,
139 bool readable
, bool writable
)
141 foreach (int remain
in wv
.until(msec_timeout
))
145 if (!readable
&& !writable
)
149 var rlist
= new List
<Socket
>();
150 var wlist
= new List
<Socket
>();
155 Socket
.Select(rlist
, wlist
, null, remain
* 1000);
157 if (rlist
.Count
> 0 || wlist
.Count
> 0)
165 public override void noread()
169 tryshutdown(SocketShutdown
.Receive
);
170 ev
.onreadable(sock
, null);
173 public override void nowrite()
177 tryshutdown(SocketShutdown
.Send
);
178 ev
.onwritable(sock
, null);
181 public override void close()
187 ev
.onreadable(sock
, null);
188 ev
.onwritable(sock
, null);
189 tryshutdown(SocketShutdown
.Both
);
191 ((IDisposable
)sock
).Dispose();
200 public class WvTcp
: WvSockStream
202 public WvTcp(string remote
, ushort port
) : base(null)
204 // FIXME: do DNS lookups asynchronously?
207 IPHostEntry ipe
= Dns
.GetHostEntry(remote
);
208 IPEndPoint ipep
= new IPEndPoint(ipe
.AddressList
[0], port
);
209 Socket sock
= new Socket(AddressFamily
.InterNetwork
,
222 public class WvUnix
: WvSockStream
224 public WvUnix(string path
) : base(null)
228 if (path
.StartsWith("@"))
229 ep
= new AbstractUnixEndPoint(path
.Substring(1));
231 ep
= new UnixEndPoint(path
);
233 Socket sock
= new Socket(AddressFamily
.Unix
,
234 SocketType
.Stream
, 0);