19#if ! defined(WITH_LWIP) && ! defined(WITH_CONTIKI) && ! defined (RIOT_VERSION)
21#if COAP_AF_UNIX_SUPPORT
29#ifdef COAP_EPOLL_SUPPORT
31#include <sys/timerfd.h>
36 return !COAP_DISABLE_TCP;
41#ifdef HAVE_SYS_SOCKET_H
42# include <sys/socket.h>
43# define OPTVAL_T(t) (t)
44# define OPTVAL_GT(t) (t)
46#ifdef HAVE_SYS_IOCTL_H
51# define OPTVAL_T(t) (const char*)(t)
52# define OPTVAL_GT(t) (char*)(t)
54# define CMSG_DATA WSA_CMSG_DATA
57#if defined(__ZEPHYR__)
58# include <zephyr/posix/sys/ioctl.h>
60# define OPTVAL_T(t) (t)
63# define OPTVAL_GT(t) (t)
66# define FIONBIO 0x5421
87 sock->
flags &= ~COAP_SOCKET_CONNECTED;
88 sock->
fd = socket(server->
addr.
sa.sa_family, SOCK_STREAM, 0);
101 coap_log_warn(
"coap_socket_connect_tcp1: ioctl FIONBIO: %s\n",
105 switch (server->
addr.
sa.sa_family) {
108 if (connect_addr.
addr.
sin.sin_port == 0)
109 connect_addr.
addr.
sin.sin_port = htons(default_port);
114 if (connect_addr.
addr.
sin6.sin6_port == 0)
115 connect_addr.
addr.
sin6.sin6_port = htons(default_port);
117 if (setsockopt(sock->
fd, IPPROTO_IPV6, IPV6_V6ONLY, OPTVAL_T(&off),
119 coap_log_warn(
"coap_socket_connect_tcp1: setsockopt IPV6_V6ONLY: %s\n",
123#if COAP_AF_UNIX_SUPPORT
127#if COAP_AF_LLC_SUPPORT
132 coap_log_alert(
"coap_socket_connect_tcp1: unsupported sa_family\n");
136 if (local_if && local_if->
addr.
sa.sa_family) {
138 if (setsockopt(sock->
fd, SOL_SOCKET, SO_REUSEADDR, OPTVAL_T(&on),
sizeof(on)) ==
COAP_SOCKET_ERROR)
139 coap_log_warn(
"coap_socket_connect_tcp1: setsockopt SO_REUSEADDR: %s\n",
141 if (bind(sock->
fd, &local_if->
addr.
sa,
143 local_if->
addr.
sa.sa_family == AF_INET ?
144 (socklen_t)
sizeof(
struct sockaddr_in) :
152 local_addr->
addr.
sa.sa_family = server->
addr.
sa.sa_family;
157 if (WSAGetLastError() == WSAEWOULDBLOCK) {
159 if (errno == EINPROGRESS) {
179#if COAP_AF_LLC_SUPPORT
199#if COAP_AF_UNIX_SUPPORT
200 if (local_if && local_if->
addr.
sa.sa_family == AF_UNIX) {
218 int optlen = (int)
sizeof(error);
220 socklen_t optlen = (socklen_t)
sizeof(error);
225 if (getsockopt(sock->
fd, SOL_SOCKET, SO_ERROR, OPTVAL_GT(&error),
232 coap_log_warn(
"coap_socket_connect_tcp2: connect failed: %s\n",
263 sock->
fd = socket(listen_addr->
addr.
sa.sa_family, SOCK_STREAM, 0);
279 if (setsockopt(sock->
fd, SOL_SOCKET, SO_KEEPALIVE, OPTVAL_T(&on),
281 coap_log_warn(
"coap_socket_bind_tcp: setsockopt SO_KEEPALIVE: %s\n",
284 if (setsockopt(sock->
fd, SOL_SOCKET, SO_REUSEADDR, OPTVAL_T(&on),
286 coap_log_warn(
"coap_socket_bind_tcp: setsockopt SO_REUSEADDR: %s\n",
289 switch (listen_addr->
addr.
sa.sa_family) {
297 if (setsockopt(sock->
fd, IPPROTO_IPV6, IPV6_V6ONLY, OPTVAL_T(&off),
299 coap_log_alert(
"coap_socket_bind_tcp: setsockopt IPV6_V6ONLY: %s\n",
303#if COAP_AF_UNIX_SUPPORT
307#if COAP_AF_LLC_SUPPORT
315 if (bind(sock->
fd, &listen_addr->
addr.
sa,
317 listen_addr->
addr.
sa.sa_family == AF_INET ?
318 (socklen_t)
sizeof(
struct sockaddr_in) :
326 bound_addr->
size = (socklen_t)
sizeof(*bound_addr);
327 if (getsockname(sock->
fd, &bound_addr->
addr.
sa, &bound_addr->
size) < 0) {
359 new_client->
fd = accept(server->
fd, &remote_addr->
addr.
sa,
363#
if EAGAIN != EWOULDBLOCK
364 && errno != EWOULDBLOCK
373 server->
flags &= ~COAP_SOCKET_CAN_ACCEPT;
375 if (getsockname(new_client->
fd, &local_addr->
addr.
sa, &local_addr->
size) < 0)
402 r = send(sock->
fd, (
const char *)data, (
int)data_len, 0);
405#define MSG_NOSIGNAL 0
411 coap_win_error_to_errno();
414#
if EAGAIN != EWOULDBLOCK
415 errno == EWOULDBLOCK ||
419#ifdef COAP_EPOLL_SUPPORT
428 if (errno == EPIPE || errno == ECONNRESET) {
437 if (r < (ssize_t)data_len) {
439#ifdef COAP_EPOLL_SUPPORT
460 r = recv(sock->
fd, (
char *)data, (
int)data_len, 0);
462 r = recv(sock->
fd, data, data_len, 0);
466 sock->
flags &= ~COAP_SOCKET_CAN_READ;
470 sock->
flags &= ~COAP_SOCKET_CAN_READ;
472 coap_win_error_to_errno();
475#
if EAGAIN != EWOULDBLOCK
476 errno == EWOULDBLOCK ||
481 if (errno != ECONNRESET) {
487 if (r < (ssize_t)data_len)
488 sock->
flags &= ~COAP_SOCKET_CAN_READ;
506#pragma GCC diagnostic ignored "-Wunused-function"
int coap_is_af_llc(const coap_address_t *a)
Checks if given address a denotes an AF_LLC address.
void coap_address_copy(coap_address_t *dst, const coap_address_t *src)
#define COAP_IPV4_SUPPORT
const char * coap_socket_format_errno(int error)
const char * coap_socket_strerror(void)
#define COAP_SOCKET_ERROR
#define COAP_INVALID_SOCKET
#define COAP_SOCKET_CAN_WRITE
non blocking socket can now write without blocking
#define COAP_SOCKET_WANT_READ
non blocking socket is waiting for reading
#define COAP_SOCKET_WANT_WRITE
non blocking socket is waiting for writing
#define COAP_SOCKET_CAN_CONNECT
non blocking client socket can now connect without blocking
void coap_epoll_ctl_mod(coap_socket_t *sock, uint32_t events, const char *func)
Epoll specific function to modify the state of events that epoll is tracking on the appropriate file ...
#define COAP_SOCKET_WANT_CONNECT
non blocking client socket is waiting for connect
#define COAP_SOCKET_CONNECTED
the socket is connected
Library specific build wrapper for coap_internal.h.
void coap_socket_dgrm_close(coap_socket_t *sock)
Function interface to close off a datagram socket.
#define coap_log_alert(...)
#define coap_log_info(...)
#define coap_log_warn(...)
int coap_socket_bind_tcp(coap_socket_t *sock, const coap_address_t *listen_addr, coap_address_t *bound_addr)
Create a new TCP socket and then listen for new incoming TCP sessions.
ssize_t coap_socket_read(coap_socket_t *sock, uint8_t *data, size_t data_len)
Function interface for data stream receiving off a socket.
ssize_t coap_socket_write(coap_socket_t *sock, const uint8_t *data, size_t data_len)
Function interface for data stream sending off a socket.
int coap_socket_connect_tcp1(coap_socket_t *sock, const coap_address_t *local_if, const coap_address_t *server, int default_port, coap_address_t *local_addr, coap_address_t *remote_addr)
Create a new TCP socket and initiate the connection.
int coap_socket_accept_tcp(coap_socket_t *server, coap_socket_t *new_client, coap_address_t *local_addr, coap_address_t *remote_addr, void *extra)
Accept a new incoming TCP session.
void coap_socket_strm_close(coap_socket_t *sock)
Function interface to close off a stream socket.
int coap_socket_connect_tcp2(coap_socket_t *sock, coap_address_t *local_addr, coap_address_t *remote_addr)
Complete the TCP Connection.
int coap_tcp_is_supported(void)
Check whether TCP is available.
Multi-purpose address abstraction.
socklen_t size
size of addr
struct coap_sockaddr_un cun
union coap_address_t::@0 addr
char sun_path[COAP_UNIX_PATH_MAX]
coap_socket_flags_t flags
1 or more of COAP_SOCKET* flag values