Make StreamServer return address of accecpted client

This commit is contained in:
frmdstryr 2019-11-18 08:45:25 -05:00 committed by Andrew Kelley
parent ed956b5812
commit aa4e92f3b3
2 changed files with 13 additions and 5 deletions

View File

@ -1360,14 +1360,22 @@ pub const StreamServer = struct {
BlockedByFirewall, BlockedByFirewall,
} || os.UnexpectedError; } || os.UnexpectedError;
/// If this function succeeds, the returned `fs.File` is a caller-managed resource. pub const Connection = struct {
pub fn accept(self: *StreamServer) AcceptError!fs.File { file: fs.File,
address: Address
};
/// If this function succeeds, the returned `Connection` is a caller-managed resource.
pub fn accept(self: *StreamServer) AcceptError!Connection {
const nonblock = if (std.io.is_async) os.SOCK_NONBLOCK else 0; const nonblock = if (std.io.is_async) os.SOCK_NONBLOCK else 0;
const accept_flags = nonblock | os.SOCK_CLOEXEC; const accept_flags = nonblock | os.SOCK_CLOEXEC;
var accepted_addr: Address = undefined; var accepted_addr: Address = undefined;
var adr_len: os.socklen_t = @sizeOf(Address); var adr_len: os.socklen_t = @sizeOf(Address);
if (os.accept4(self.sockfd.?, &accepted_addr.any, &adr_len, accept_flags)) |fd| { if (os.accept4(self.sockfd.?, &accepted_addr.any, &adr_len, accept_flags)) |fd| {
return fs.File.openHandle(fd); return Connection{
.file = fs.File.openHandle(fd),
.address = accepted_addr,
};
} else |err| switch (err) { } else |err| switch (err) {
// We only give SOCK_NONBLOCK when I/O mode is async, in which case this error // We only give SOCK_NONBLOCK when I/O mode is async, in which case this error
// is handled by os.accept4. // is handled by os.accept4.

View File

@ -115,8 +115,8 @@ fn testClient(addr: net.Address) anyerror!void {
} }
fn testServer(server: *net.StreamServer) anyerror!void { fn testServer(server: *net.StreamServer) anyerror!void {
var client_file = try server.accept(); var client = try server.accept();
const stream = &client_file.outStream().stream; const stream = &client.file.outStream().stream;
try stream.print("hello from server\n"); try stream.print("hello from server\n");
} }