µOS++ IIIe Reference 7.0.0
The third edition of µOS++, a POSIX inspired open source framework, written in C++
Loading...
Searching...
No Matches
socket.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the µOS++ project (https://micro-os-plus.github.io/).
3 * Copyright (c) 2015-2025 Liviu Ionescu. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software
6 * for any purpose is hereby granted, under the terms of the MIT license.
7 *
8 * If a copy of the license was not distributed with this file, it can
9 * be obtained from https://opensource.org/licenses/mit.
10 */
11
12#include <cerrno>
13
14#if defined(OS_USE_OS_APP_CONFIG_H)
15#include <cmsis-plus/os-app-config.h>
16#endif
17
20
22
23// ----------------------------------------------------------------------------
24
25#if defined(__clang__)
26#pragma clang diagnostic ignored "-Wc++98-compat"
27#endif
28
29// ----------------------------------------------------------------------------
30
31namespace os
32{
33 namespace posix
34 {
35 // ========================================================================
36
38 : io{ impl, type::socket }, //
39 net_stack_ (&ns)
40 {
41#if defined(OS_TRACE_POSIX_IO_SOCKET)
42 trace::printf ("socket::%s()=@%p\n", __func__, this);
43#endif
44 }
45
47 {
48#if defined(OS_TRACE_POSIX_IO_SOCKET)
49 trace::printf ("socket::%s() @%p\n", __func__, this);
50#endif
51
52 net_stack_ = nullptr;
53 }
54
55 // ------------------------------------------------------------------------
56
57 class socket*
58 socket::accept (/* struct */ sockaddr* address, socklen_t* address_len)
59 {
60 errno = 0;
61
62 // Execute the implementation specific code.
63 class socket* new_socket = impl ().do_accept (address, address_len);
64 if (new_socket == nullptr)
65 {
66 return nullptr;
67 }
68 new_socket->alloc_file_descriptor ();
69 return new_socket;
70 }
71
72 int
73 socket::bind (const /* struct */ sockaddr* address, socklen_t address_len)
74 {
75 errno = 0;
76
77 // Execute the implementation specific code.
78 return impl ().do_bind (address, address_len);
79 }
80
81 int
82 socket::connect (const /* struct */ sockaddr* address,
83 socklen_t address_len)
84 {
85 errno = 0;
86
87 // Execute the implementation specific code.
88 return impl ().do_connect (address, address_len);
89 }
90
91 int
92 socket::getpeername (/* struct */ sockaddr* address,
93 socklen_t* address_len)
94 {
95 errno = 0;
96
97 // Execute the implementation specific code.
98 return impl ().do_getpeername (address, address_len);
99 }
100
101 int
102 socket::getsockname (/* struct */ sockaddr* address,
103 socklen_t* address_len)
104 {
105 errno = 0;
106
107 // Execute the implementation specific code.
108 return impl ().do_getsockname (address, address_len);
109 }
110
111 int
112 socket::getsockopt (int level, int option_name, void* option_value,
113 socklen_t* option_len)
114 {
115 errno = 0;
116
117 // Execute the implementation specific code.
118 return impl ().do_getsockopt (level, option_name, option_value,
119 option_len);
120 }
121
122 int
123 socket::listen (int backlog)
124 {
125 errno = 0;
126
127 // Execute the implementation specific code.
128 return impl ().do_listen (backlog);
129 }
130
131 ssize_t
132 socket::recv (void* buffer, size_t length, int flags)
133 {
134 errno = 0;
135
136 // Execute the implementation specific code.
137 return impl ().do_recv (buffer, length, flags);
138 }
139
140 ssize_t
141 socket::recvfrom (void* buffer, size_t length, int flags,
142 /* struct */ sockaddr* address, socklen_t* address_len)
143 {
144 errno = 0;
145
146 // Execute the implementation specific code.
147 return impl ().do_recvfrom (buffer, length, flags, address, address_len);
148 }
149
150 ssize_t
151 socket::recvmsg (/* struct */ msghdr* message, int flags)
152 {
153 errno = 0;
154
155 // Execute the implementation specific code.
156 return impl ().do_recvmsg (message, flags);
157 }
158
159 ssize_t
160 socket::send (const void* buffer, size_t length, int flags)
161 {
162 errno = 0;
163
164 // Execute the implementation specific code.
165 return impl ().do_send (buffer, length, flags);
166 }
167
168 ssize_t
169 socket::sendmsg (const /* struct */ msghdr* message, int flags)
170 {
171 errno = 0;
172
173 // Execute the implementation specific code.
174 return impl ().do_sendmsg (message, flags);
175 }
176
177 ssize_t
178 socket::sendto (const void* message, size_t length, int flags,
179 const /* struct */ sockaddr* dest_addr, socklen_t dest_len)
180 {
181 errno = 0;
182
183 // Execute the implementation specific code.
184 return impl ().do_sendto (message, length, flags, dest_addr, dest_len);
185 }
186
187 int
188 socket::setsockopt (int level, int option_name, const void* option_value,
189 socklen_t option_len)
190 {
191 errno = 0;
192
193 // Execute the implementation specific code.
194 return impl ().do_setsockopt (level, option_name, option_value,
195 option_len);
196 }
197
198 int
200 {
201 errno = 0;
202
203 // Execute the implementation specific code.
204 return impl ().do_shutdown (how);
205 }
206
207 int
209 {
210 errno = 0;
211
212 // Execute the implementation specific code.
213 return impl ().do_sockatmark ();
214 }
215 // ========================================================================
216
218 {
219#if defined(OS_TRACE_POSIX_IO_SOCKET)
220 trace::printf ("socket_impl::%s()=%p\n", __func__, this);
221#endif
222 }
223
225 {
226#if defined(OS_TRACE_POSIX_IO_SOCKET)
227 trace::printf ("socket_impl::%s() @%p\n", __func__, this);
228#endif
229 }
230
231 // ========================================================================
232 } /* namespace posix */
233} /* namespace os */
234
235// ----------------------------------------------------------------------------
Base I/O class.
Definition io.h:86
io * alloc_file_descriptor(void)
Definition io.cpp:189
Network stack class.
Definition net-stack.h:81
virtual int do_bind(const sockaddr *address, socklen_t address_len)=0
virtual int do_getpeername(sockaddr *address, socklen_t *address_len)=0
virtual int do_getsockopt(int level, int option_name, void *option_value, socklen_t *option_len)=0
virtual socket * do_accept(sockaddr *address, socklen_t *address_len)=0
virtual int do_listen(int backlog)=0
virtual ~socket_impl() override
Definition socket.cpp:224
virtual int do_setsockopt(int level, int option_name, const void *option_value, socklen_t option_len)=0
virtual ssize_t do_recvfrom(void *buffer, size_t length, int flags, sockaddr *address, socklen_t *address_len)=0
virtual ssize_t do_sendmsg(const msghdr *message, int flags)=0
virtual ssize_t do_recv(void *buffer, size_t length, int flags)=0
virtual ssize_t do_send(const void *buffer, size_t length, int flags)=0
virtual ssize_t do_sendto(const void *message, size_t length, int flags, const sockaddr *dest_addr, socklen_t dest_len)=0
virtual int do_getsockname(sockaddr *address, socklen_t *address_len)=0
virtual ssize_t do_recvmsg(msghdr *message, int flags)=0
virtual int do_connect(const sockaddr *address, socklen_t address_len)=0
virtual int do_sockatmark(void)=0
virtual int do_shutdown(int how)=0
Network socket.
virtual int setsockopt(int level, int option_name, const void *option_value, socklen_t option_len)
Definition socket.cpp:188
virtual int sockatmark(void)
Definition socket.cpp:208
virtual int listen(int backlog)
Definition socket.cpp:123
virtual int getsockname(sockaddr *address, socklen_t *address_len)
Definition socket.cpp:102
virtual socket * accept(sockaddr *address, socklen_t *address_len)
Definition socket.cpp:58
virtual int bind(const sockaddr *address, socklen_t address_len)
Definition socket.cpp:73
virtual ssize_t recv(void *buffer, size_t length, int flags)
Definition socket.cpp:132
virtual ssize_t sendto(const void *message, size_t length, int flags, const sockaddr *dest_addr, socklen_t dest_len)
Definition socket.cpp:178
virtual ssize_t send(const void *buffer, size_t length, int flags)
Definition socket.cpp:160
virtual int getpeername(sockaddr *address, socklen_t *address_len)
Definition socket.cpp:92
virtual ssize_t sendmsg(const msghdr *message, int flags)
Definition socket.cpp:169
virtual int connect(const sockaddr *address, socklen_t address_len)
Definition socket.cpp:82
virtual ssize_t recvfrom(void *buffer, size_t length, int flags, sockaddr *address, socklen_t *address_len)
Definition socket.cpp:141
virtual int shutdown(int how)
Definition socket.cpp:199
virtual ~socket() override
Definition socket.cpp:46
virtual ssize_t recvmsg(msghdr *message, int flags)
Definition socket.cpp:151
virtual int getsockopt(int level, int option_name, void *option_value, socklen_t *option_len)
Definition socket.cpp:112
socket_impl & impl(void) const
int printf(const char *format,...)
Write a formatted string to the trace device.
Definition trace.cpp:59
System namespace.
uint32_t socklen_t