int ISocketsDriver.connect(int socket, IntPtr address, int addressLen) { Socket sock = null; if (!GetSocket(socket, out sock)) { return(ReturnError(SocketError.NotSocket)); } try { SockAddr sa = new SockAddr(); sa.MarshalFromNative(address); sock.BeginConnect(new IPEndPoint(sa.sin_addr, sa.sin_port), new AsyncCallback(EndSockConnect), socket); } catch (SocketException se) { return(ReturnError(se.SocketErrorCode)); } catch { return(ReturnError(SocketError.SocketError)); } return(ReturnError(SocketError.WouldBlock)); }
int ISocketsDriver.bind(int socket, IntPtr address, int addressLen) { SocketData sd = null; if (!GetSocketData(socket, out sd)) { return(ReturnError(SocketError.NotSocket)); } try { SockAddr sa = new SockAddr(); sa.MarshalFromNative(address); if (sa.sin_port == 80) { sa.sin_port++; } IPEndPoint ep = new IPEndPoint(sa.sin_addr, sa.sin_port); sd.Socket.Bind(ep); } catch (SocketException se) { return(ReturnError(se.SocketErrorCode)); } catch { return(ReturnError(SocketError.SocketError)); } return((int)SocketError.Success); }
int ISocketsDriver.recvfrom(int socket, IntPtr buf, int len, int flags, IntPtr from, ref int fromlen) { SocketData sd = null; if (!GetSocketData(socket, out sd)) { return(ReturnError(SocketError.NotSocket)); } try { if (sd.Socket.Poll(0, SelectMode.SelectRead)) { byte[] data = new byte[len]; int read = 0; SockAddr fromAddr = new SockAddr(); fromAddr.MarshalFromNative(from); EndPoint fromEP = new IPEndPoint(fromAddr.sin_addr, fromAddr.sin_port); read = sd.Socket.ReceiveFrom(data, 0, len, (SocketFlags)flags, ref fromEP); Marshal.Copy(data, 0, buf, read); fromAddr.sin_addr = IPAddressToUint(((IPEndPoint)fromEP).Address); fromAddr.sin_port = (ushort)((IPEndPoint)fromEP).Port; fromAddr.sin_family = (short)((IPEndPoint)fromEP).AddressFamily; fromAddr.MarshalToNative(from); return(read); } } catch (SocketException se) { return(ReturnError((SocketError)se.ErrorCode)); } finally { ClearSocketEvent(socket, true); } return(ReturnError(SocketError.WouldBlock)); }
int ISocketsDriver.sendto(int socket, IntPtr buf, int len, int flags, IntPtr to, ref int tolen) { SocketData sd = null; if (!GetSocketData(socket, out sd)) { return(ReturnError(SocketError.NotSocket)); } try { if (sd.Socket.Poll(0, SelectMode.SelectWrite)) { byte[] data = new byte[len]; int sent = 0; Marshal.Copy(buf, data, 0, len); SockAddr toAddr = new SockAddr(); toAddr.MarshalFromNative(to); IPEndPoint toEP = new IPEndPoint(toAddr.sin_addr, toAddr.sin_port); sent = sd.Socket.SendTo(data, 0, len, (SocketFlags)flags, toEP); ClearSocketEvent(socket, false); return(sent); } } catch (SocketException se) { return(ReturnError((SocketError)se.ErrorCode)); } return(ReturnError(SocketError.WouldBlock)); }