MCPcopy Create free account
hub / github.com/WasmEdge/WasmEdge / sockSendTo

Method sockSendTo

lib/host/wasi/inode-win.cpp:1871–1925  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1869}
1870
1871WasiExpect<void> INode::sockSendTo(Span<Span<const uint8_t>> SiData,
1872 __wasi_siflags_t,
1873 __wasi_address_family_t AddressFamily,
1874 Span<const uint8_t> Address, uint16_t Port,
1875 __wasi_size_t &NWritten) const noexcept {
1876 EXPECTED_TRY(detail::ensureWSAStartup());
1877
1878 std::size_t TotalBufSize = 0;
1879 for (auto &IOV : SiData) {
1880 TotalBufSize += IOV.size();
1881 }
1882 std::vector<uint8_t> TotalBuf(TotalBufSize);
1883 Span<uint8_t> TotalBufView(TotalBuf);
1884 for (auto &IOV : SiData) {
1885 std::copy_n(IOV.begin(), IOV.size(), TotalBufView.begin());
1886 TotalBufView = TotalBufView.subspan(IOV.size());
1887 }
1888 assuming(TotalBufView.empty());
1889
1890 Variant<sockaddr, sockaddr_in, sockaddr_in6> ClientAddr;
1891 socklen_t MsgNameLen = 0;
1892
1893 if (AddressFamily == __WASI_ADDRESS_FAMILY_INET4) {
1894 auto &ClientAddr4 = ClientAddr.emplace<sockaddr_in>();
1895 MsgNameLen = sizeof(ClientAddr4);
1896
1897 ClientAddr4.sin_family = AF_INET;
1898 ClientAddr4.sin_port = htons(Port);
1899 assuming(Address.size() >= sizeof(in_addr));
1900 std::memcpy(&ClientAddr4.sin_addr, Address.data(), sizeof(in_addr));
1901 } else if (AddressFamily == __WASI_ADDRESS_FAMILY_INET6) {
1902 auto &ClientAddr6 = ClientAddr.emplace<sockaddr_in6>();
1903 MsgNameLen = sizeof(ClientAddr6);
1904
1905 ClientAddr6.sin6_family = AF_INET6;
1906 ClientAddr6.sin6_flowinfo = 0;
1907 ClientAddr6.sin6_port = htons(Port);
1908 assuming(Address.size() >= sizeof(in6_addr));
1909 std::memcpy(&ClientAddr6.sin6_addr, Address.data(), sizeof(in6_addr));
1910 }
1911
1912 const int SysSiFlags = 0;
1913
1914 if (auto Res = sendto(Socket, reinterpret_cast<char *>(TotalBuf.data()),
1915 static_cast<int>(TotalBufSize), SysSiFlags,
1916 MsgNameLen == 0 ? nullptr : &ClientAddr.get<sockaddr>(),
1917 MsgNameLen);
1918 unlikely(Res == SOCKET_ERROR_)) {
1919 return WasiUnexpect(detail::fromWSALastError());
1920 } else {
1921 NWritten = static_cast<__wasi_size_t>(Res);
1922 }
1923
1924 return {};
1925}
1926
1927WasiExpect<void> INode::sockShutdown(__wasi_sdflags_t SdFlags) const noexcept {
1928 EXPECTED_TRY(detail::ensureWSAStartup());

Callers 1

bodyMethod · 0.45

Calls 10

ensureWSAStartupFunction · 0.85
unlikelyFunction · 0.85
WasiUnexpectFunction · 0.85
fromWSALastErrorFunction · 0.85
subspanMethod · 0.80
EXPECTED_TRYFunction · 0.50
sizeMethod · 0.45
beginMethod · 0.45
emptyMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected