| ... | ... | @@ -1867,6 +1867,7 @@ pub const StreamServer = struct { |
| 1867 | 1867 | /// Copied from `Options` on `init`. |
| 1868 | 1868 | kernel_backlog: u31, |
| 1869 | 1869 | reuse_address: bool, |
| 1870 | reuse_port: bool, |
| 1870 | 1871 | |
| 1871 | 1872 | /// `undefined` until `listen` returns successfully. |
| 1872 | 1873 | listen_address: Address, |
| ... | ... | @@ -1881,6 +1882,9 @@ pub const StreamServer = struct { |
| 1881 | 1882 | |
| 1882 | 1883 | /// Enable SO.REUSEADDR on the socket. |
| 1883 | 1884 | reuse_address: bool = false, |
| 1885 | |
| 1886 | /// Enable SO.REUSEPORT on the socket. |
| 1887 | reuse_port: bool = false, |
| 1884 | 1888 | }; |
| 1885 | 1889 | |
| 1886 | 1890 | /// After this call succeeds, resources have been acquired and must |
| ... | ... | @@ -1890,6 +1894,7 @@ pub const StreamServer = struct { |
| 1890 | 1894 | .sockfd = null, |
| 1891 | 1895 | .kernel_backlog = options.kernel_backlog, |
| 1892 | 1896 | .reuse_address = options.reuse_address, |
| 1897 | .reuse_port = options.reuse_port, |
| 1893 | 1898 | .listen_address = undefined, |
| 1894 | 1899 | }; |
| 1895 | 1900 | } |
| ... | ... | @@ -1920,6 +1925,14 @@ pub const StreamServer = struct { |
| 1920 | 1925 | &mem.toBytes(@as(c_int, 1)), |
| 1921 | 1926 | ); |
| 1922 | 1927 | } |
| 1928 | if (@hasDecl(os.SO, "REUSEPORT") and self.reuse_port) { |
| 1929 | try os.setsockopt( |
| 1930 | sockfd, |
| 1931 | os.SOL.SOCKET, |
| 1932 | os.SO.REUSEPORT, |
| 1933 | &mem.toBytes(@as(c_int, 1)), |
| 1934 | ); |
| 1935 | } |
| 1923 | 1936 | |
| 1924 | 1937 | var socklen = address.getOsSockLen(); |
| 1925 | 1938 | try os.bind(sockfd, &address.any, socklen); |