mirror of
https://github.com/ziglang/zig.git
synced 2024-11-30 17:12:31 +00:00
Make StreamServer return address of accecpted client
This commit is contained in:
parent
ed956b5812
commit
aa4e92f3b3
@ -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.
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user