private void CompleteAccept(AcceptSocketContext acceptContext, int result) { if (result < 0) { var err = -result; if (err == EAGAIN || err == EINTR || err == EMFILE) { Debug.WriteLine($"accept completed with EAGAIN on {(int)acceptContext.Socket}"); Accept(acceptContext); return; } throw new ErrnoException(err); } LinuxSocket socket = result; Debug.WriteLine($"Accepted {(int)socket} from {(int)acceptContext.Socket}"); if (_threadContext.Options.TcpNoDelay) { socket.SetOption(SOL_TCP, TCP_NODELAY, 1); } var remoteEndpoint = IPEndPointFormatter.AddrToIpEndPoint(acceptContext.Addr); var context = new InboundConnectionContext(socket, acceptContext.EndPoint, remoteEndpoint, _threadContext); _connections[socket] = context; acceptContext.AcceptQueue.TryWrite(context); Accept(acceptContext); Read(context); ReadFromApp(context); }
public unsafe EndPoint GetLocalAddress() { sockaddr_storage addr; socklen_t length = SizeOf.sockaddr_storage; if (getsockname(_fd, (sockaddr *)&addr, &length) != 0) { throw new ErrnoException(errno); } return(IPEndPointFormatter.AddrToIpEndPoint(&addr)); }
public unsafe LinuxSocket Accept(out IPEndPoint endPoint) { sockaddr_storage addr; socklen_t len = SizeOf.sockaddr_storage; var rv = accept4(_fd, (sockaddr *)&addr, &len, SOCK_NONBLOCK | SOCK_CLOEXEC); if (rv < 0) { var err = errno; if (err == EAGAIN || err == EWOULDBLOCK || err == EINTR) { endPoint = default; return(-1); } throw new ErrnoException(err); } endPoint = IPEndPointFormatter.AddrToIpEndPoint(&addr); return(rv); }