mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-20 21:43:12 -07:00
Non-blocking connect
This commit is contained in:
parent
e2fc84e0e6
commit
042e698749
15 changed files with 266 additions and 72 deletions
|
@ -18,27 +18,14 @@
|
|||
#ifndef CHIAKI_COMMON_H
|
||||
#define CHIAKI_COMMON_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#ifdef _WIN32
|
||||
#define chiaki_socket_t SOCKET
|
||||
#define CHIAKI_SOCKET_IS_INVALID(s) ((s) == INVALID_SOCKET)
|
||||
#define CHIAKI_INVALID_SOCKET INVALID_SOCKET
|
||||
#define CHIAKI_SOCKET_CLOSE(s) closesocket(s)
|
||||
#define CHIAKI_SOCKET_ERROR_FMT "%d"
|
||||
#define CHIAKI_SOCKET_ERROR_VALUE (WSAGetLastError())
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#define chiaki_socket_t int
|
||||
#define CHIAKI_SOCKET_IS_INVALID(s) ((s) < 0)
|
||||
#define CHIAKI_INVALID_SOCKET (-1)
|
||||
#define CHIAKI_SOCKET_CLOSE(s) close(s)
|
||||
#define CHIAKI_SOCKET_ERROR_FMT "%s"
|
||||
#define CHIAKI_SOCKET_ERROR_VALUE (strerror(errno))
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -56,6 +43,9 @@ typedef enum
|
|||
CHIAKI_ERR_MEMORY,
|
||||
CHIAKI_ERR_OVERFLOW,
|
||||
CHIAKI_ERR_NETWORK,
|
||||
CHIAKI_ERR_CONNECTION_REFUSED,
|
||||
CHIAKI_ERR_HOST_DOWN,
|
||||
CHIAKI_ERR_HOST_UNREACH,
|
||||
CHIAKI_ERR_DISCONNECTED,
|
||||
CHIAKI_ERR_INVALID_DATA,
|
||||
CHIAKI_ERR_BUF_TOO_SMALL,
|
||||
|
|
56
lib/include/chiaki/sock.h
Normal file
56
lib/include/chiaki/sock.h
Normal file
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* This file is part of Chiaki.
|
||||
*
|
||||
* Chiaki is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Chiaki is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Chiaki. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CHIAKI_SOCK_H
|
||||
#define CHIAKI_SOCK_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
typedef SOCKET chiaki_socket_t;
|
||||
#define CHIAKI_SOCKET_IS_INVALID(s) ((s) == INVALID_SOCKET)
|
||||
#define CHIAKI_INVALID_SOCKET INVALID_SOCKET
|
||||
#define CHIAKI_SOCKET_CLOSE(s) closesocket(s)
|
||||
#define CHIAKI_SOCKET_ERROR_FMT "%d"
|
||||
#define CHIAKI_SOCKET_ERROR_VALUE (WSAGetLastError())
|
||||
#define CHIAKI_SOCKET_EINPROGRESS (WSAGetLastError() == WSAEWOULDBLOCK)
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
typedef int chiaki_socket_t;
|
||||
#define CHIAKI_SOCKET_IS_INVALID(s) ((s) < 0)
|
||||
#define CHIAKI_INVALID_SOCKET (-1)
|
||||
#define CHIAKI_SOCKET_CLOSE(s) close(s)
|
||||
#define CHIAKI_SOCKET_ERROR_FMT "%s"
|
||||
#define CHIAKI_SOCKET_ERROR_VALUE (strerror(errno))
|
||||
#define CHIAKI_SOCKET_EINPROGRESS (errno == EINPROGRESS)
|
||||
#endif
|
||||
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_socket_set_nonblock(chiaki_socket_t sock, bool nonblock);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //CHIAKI_SOCK_H
|
|
@ -18,10 +18,11 @@
|
|||
#ifndef CHIAKI_STOPPIPE_H
|
||||
#define CHIAKI_STOPPIPE_H
|
||||
|
||||
#include "common.h"
|
||||
#include "sock.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
|
@ -40,11 +41,17 @@ typedef struct chiaki_stop_pipe_t
|
|||
#endif
|
||||
} ChiakiStopPipe;
|
||||
|
||||
struct sockaddr;
|
||||
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_stop_pipe_init(ChiakiStopPipe *stop_pipe);
|
||||
CHIAKI_EXPORT void chiaki_stop_pipe_fini(ChiakiStopPipe *stop_pipe);
|
||||
CHIAKI_EXPORT void chiaki_stop_pipe_stop(ChiakiStopPipe *stop_pipe);
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_stop_pipe_select_single(ChiakiStopPipe *stop_pipe, chiaki_socket_t fd, uint64_t timeout_ms);
|
||||
static inline ChiakiErrorCode chiaki_stop_pipe_sleep(ChiakiStopPipe *stop_pipe, uint64_t timeout_ms) { return chiaki_stop_pipe_select_single(stop_pipe, CHIAKI_INVALID_SOCKET, timeout_ms); }
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_stop_pipe_select_single(ChiakiStopPipe *stop_pipe, chiaki_socket_t fd, bool write, uint64_t timeout_ms);
|
||||
/**
|
||||
* Like connect(), but can be canceled by the stop pipe. Only makes sense with a non-blocking socket.
|
||||
*/
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_stop_pipe_connect(ChiakiStopPipe *stop_pipe, chiaki_socket_t fd, struct sockaddr *addr, size_t addrlen);
|
||||
static inline ChiakiErrorCode chiaki_stop_pipe_sleep(ChiakiStopPipe *stop_pipe, uint64_t timeout_ms) { return chiaki_stop_pipe_select_single(stop_pipe, CHIAKI_INVALID_SOCKET, false, timeout_ms); }
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_stop_pipe_reset(ChiakiStopPipe *stop_pipe);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -213,7 +213,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send(ChiakiTakion *takion, uint8_t *
|
|||
/**
|
||||
* Thread-safe while Takion is running.
|
||||
*
|
||||
* @param optional pointer to write the sequence number of the sent package to
|
||||
* @param optional pointer to write the sequence number of the sent packet to
|
||||
*/
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_message_data(ChiakiTakion *takion, uint8_t chunk_flags, uint16_t channel, uint8_t *buf, size_t buf_size, ChiakiSeqNum32 *seq_num);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue