| ... | @@ -1867,6 +1867,7 @@ pub const StreamServer = struct { | ... | @@ -1867,6 +1867,7 @@ pub const StreamServer = struct { |
| 1867 | /// Copied from `Options` on `init`. | 1867 | /// Copied from `Options` on `init`. |
| 1868 | kernel_backlog: u31, | 1868 | kernel_backlog: u31, |
| 1869 | reuse_address: bool, | 1869 | reuse_address: bool, |
| | 1870 | reuse_port: bool, |
| 1870 | | 1871 | |
| 1871 | /// `undefined` until `listen` returns successfully. | 1872 | /// `undefined` until `listen` returns successfully. |
| 1872 | listen_address: Address, | 1873 | listen_address: Address, |
| ... | @@ -1881,6 +1882,9 @@ pub const StreamServer = struct { | ... | @@ -1881,6 +1882,9 @@ pub const StreamServer = struct { |
| 1881 | | 1882 | |
| 1882 | /// Enable SO.REUSEADDR on the socket. | 1883 | /// Enable SO.REUSEADDR on the socket. |
| 1883 | reuse_address: bool = false, | 1884 | reuse_address: bool = false, |
| | 1885 | |
| | 1886 | /// Enable SO.REUSEPORT on the socket. |
| | 1887 | reuse_port: bool = false, |
| 1884 | }; | 1888 | }; |
| 1885 | | 1889 | |
| 1886 | /// After this call succeeds, resources have been acquired and must | 1890 | /// After this call succeeds, resources have been acquired and must |
| ... | @@ -1890,6 +1894,7 @@ pub const StreamServer = struct { | ... | @@ -1890,6 +1894,7 @@ pub const StreamServer = struct { |
| 1890 | .sockfd = null, | 1894 | .sockfd = null, |
| 1891 | .kernel_backlog = options.kernel_backlog, | 1895 | .kernel_backlog = options.kernel_backlog, |
| 1892 | .reuse_address = options.reuse_address, | 1896 | .reuse_address = options.reuse_address, |
| | 1897 | .reuse_port = options.reuse_port, |
| 1893 | .listen_address = undefined, | 1898 | .listen_address = undefined, |
| 1894 | }; | 1899 | }; |
| 1895 | } | 1900 | } |
| ... | @@ -1920,6 +1925,14 @@ pub const StreamServer = struct { | ... | @@ -1920,6 +1925,14 @@ pub const StreamServer = struct { |
| 1920 | &mem.toBytes(@as(c_int, 1)), | 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 | var socklen = address.getOsSockLen(); | 1937 | var socklen = address.getOsSockLen(); |
| 1925 | try os.bind(sockfd, &address.any, socklen); | 1938 | try os.bind(sockfd, &address.any, socklen); |