Index: src/OFSCTPSocket.h ================================================================== --- src/OFSCTPSocket.h +++ src/OFSCTPSocket.h @@ -146,11 +146,11 @@ * * @param host The host to bind to. Use `@"0.0.0.0"` for IPv4 or `@"::"` for * IPv6 to bind to all. * @param port The port to bind to. If the port is 0, an unused port will be * chosen, which can be obtained using the return value. - * @return The port the socket was bound to + * @return The address the socket was bound to */ -- (uint16_t)bindToHost: (OFString *)host port: (uint16_t)port; +- (OFSocketAddress)bindToHost: (OFString *)host port: (uint16_t)port; @end OF_ASSUME_NONNULL_END Index: src/OFSCTPSocket.m ================================================================== --- src/OFSCTPSocket.m +++ src/OFSCTPSocket.m @@ -213,11 +213,11 @@ objc_autoreleasePoolPop(pool); } #endif -- (uint16_t)bindToHost: (OFString *)host port: (uint16_t)port +- (OFSocketAddress)bindToHost: (OFString *)host port: (uint16_t)port { const int one = 1; void *pool = objc_autoreleasePoolPush(); OFData *socketAddresses; OFSocketAddress address; @@ -265,15 +265,10 @@ port: port socket: self errNo: errNo]; } - objc_autoreleasePoolPop(pool); - - if (port > 0) - return port; - memset(&address, 0, sizeof(address)); address.length = (socklen_t)sizeof(address.sockaddr); if (OFGetSockName(_socket, (struct sockaddr *)&address.sockaddr, &address.length) != 0) { @@ -288,14 +283,16 @@ errNo: errNo]; } switch (((struct sockaddr *)&address.sockaddr)->sa_family) { case AF_INET: - return OFFromBigEndian16(address.sockaddr.in.sin_port); + address.family = OFSocketAddressFamilyIPv4; + break; # ifdef OF_HAVE_IPV6 case AF_INET6: - return OFFromBigEndian16(address.sockaddr.in6.sin6_port); + address.family = OFSocketAddressFamilyIPv6; + break; # endif default: closesocket(_socket); _socket = OFInvalidSocketHandle; @@ -303,10 +300,14 @@ exceptionWithHost: host port: port socket: self errNo: EAFNOSUPPORT]; } + + objc_autoreleasePoolPop(pool); + + return address; } - (void)setCanDelaySendingPackets: (bool)canDelaySendingPackets { int v = !canDelaySendingPackets; Index: tests/OFSCTPSocketTests.m ================================================================== --- tests/OFSCTPSocketTests.m +++ tests/OFSCTPSocketTests.m @@ -30,18 +30,18 @@ @implementation OFSCTPSocketTests - (void)testSCTPSocket { OFSCTPSocket *server, *client, *accepted; - uint16_t port; + OFSocketAddress address; char buffer[6]; server = [OFSCTPSocket socket]; client = [OFSCTPSocket socket]; @try { - port = [server bindToHost: @"127.0.0.1" port: 0]; + address = [server bindToHost: @"127.0.0.1" port: 0]; } @catch (OFBindSocketFailedException *e) { switch (e.errNo) { case EPROTONOSUPPORT: OTSkip(@"SCTP unsupported"); default: @@ -49,11 +49,12 @@ } } [server listen]; - [client connectToHost: @"127.0.0.1" port: port]; + [client connectToHost: @"127.0.0.1" + port: OFSocketAddressIPPort(&address)]; accepted = [server accept]; OTAssertEqualObjects(OFSocketAddressString(accepted.remoteAddress), @"127.0.0.1");