wip client
This commit is contained in:
1 parent
6f909a752b
commit
31e88525ae
3 files changed
+170
-5
No files matched your search
@@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "str.h"
|
||||||
|
|
||||||
struct client_conf {
|
struct client_conf {
|
||||||
|
str_view_t addr;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+88
-1
@@ -1,5 +1,92 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "io.h"
|
||||||
|
#include "str.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
struct client_ctx {
|
||||||
|
int fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void addrinfo_cleanup(struct addrinfo **ai) {
|
||||||
|
if (*ai)
|
||||||
|
freeaddrinfo(*ai);
|
||||||
|
*ai = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static int
|
||||||
|
|
||||||
|
static int client_init(const struct client_conf *conf, struct client_ctx *ctx) {
|
||||||
|
SB_SCOPED(addr_str);
|
||||||
|
struct addrinfo *ai_res __attribute__((cleanup(addrinfo_cleanup))) = NULL;
|
||||||
|
struct addrinfo *ai;
|
||||||
|
struct addrinfo hints;
|
||||||
|
in_port_t *port;
|
||||||
|
int addrinfo_res;
|
||||||
|
FD_SCOPED(sock_fd);
|
||||||
|
|
||||||
|
if (sb_is_null(addr_str = sb_from_sv(conf->addr)))
|
||||||
|
FAIL("failed to alloc");
|
||||||
|
|
||||||
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_socktype = SOCK_DGRAM;
|
||||||
|
hints.ai_protocol = IPPROTO_UDP;
|
||||||
|
|
||||||
|
if ((addrinfo_res = getaddrinfo(addr_str.ptr, NULL, &hints, &ai_res)))
|
||||||
|
FAIL("failed to resolve name: %s", gai_strerror(addrinfo_res));
|
||||||
|
|
||||||
|
for (ai = ai_res; ai; ai = ai->ai_next) {
|
||||||
|
switch (ai->ai_family) {
|
||||||
|
case AF_INET:
|
||||||
|
port = &((struct sockaddr_in *)ai->ai_addr)->sin_port;
|
||||||
|
break;
|
||||||
|
case AF_INET6:
|
||||||
|
port = &((struct sockaddr_in6 *)ai->ai_addr)->sin6_port;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
port = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!port)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
*port = htons(conf->port);
|
||||||
|
|
||||||
|
if ((sock_fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {
|
||||||
|
LOG_ERR("failed to create socket: %s", strerror(errno));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setsockopt_int(sock_fd, SOL_SOCKET, SO_REUSEADDR, 1)) {
|
||||||
|
LOG_ERR("failed to set SO_REUSEADDR: %s", strerror(errno));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: ping, connect
|
||||||
|
|
||||||
|
printf("res family=%d\n", ai->ai_family);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setsockopt_int(sock_fd, SOL_SOCKET, SO_TIMESTAMP, 1))
|
||||||
|
FAIL("failed to set SO_TIMESTAMP: %s", strerror(errno));
|
||||||
|
|
||||||
|
ctx->fd = FD_RELEASE(&sock_fd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int client(const struct client_conf *conf) {
|
||||||
|
struct client_ctx ctx;
|
||||||
|
|
||||||
|
if (client_init(conf, &ctx))
|
||||||
|
FAIL("failed to create client socket");
|
||||||
|
|
||||||
int client(const struct client_conf *conf) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
+79
-4
@@ -1,13 +1,81 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <errno.h>
|
#include <stdio.h>
|
||||||
|
#include "eventloop.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "defaults.h"
|
#include "defaults.h"
|
||||||
|
#include "str.h"
|
||||||
|
|
||||||
// #define DEFAULT_PORT 34802
|
#include <sys/types.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
static int ev_test(void) {
|
||||||
|
struct owd_event timer, pipe_ev;
|
||||||
|
struct owd_eventloop el;
|
||||||
|
EVENTLOOP_STACK_SCOPED(el_ptr);
|
||||||
|
owd_event_id_t id;
|
||||||
|
uint32_t flags;
|
||||||
|
|
||||||
|
int pfds[2];
|
||||||
|
if (pipe(pfds))
|
||||||
|
FAIL("pipe: %s", strerror(errno));
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid < 0)
|
||||||
|
FAIL("fork: %s", strerror(errno));
|
||||||
|
|
||||||
|
if (!pid) {
|
||||||
|
char buf[] = "hello!";
|
||||||
|
sleep(5);
|
||||||
|
write(pfds[1], buf, sizeof(buf));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (owd_eventloop_init(&el))
|
||||||
|
FAIL("failed to init event loop");
|
||||||
|
el_ptr = ⪙
|
||||||
|
|
||||||
|
if (owd_eventloop_add_timer(&el, &timer, 2000, false))
|
||||||
|
FAIL("failed to add timer");
|
||||||
|
|
||||||
|
if (owd_eventloop_add_fd(&el, &pipe_ev, pfds[0], OWD_EVENT_READABLE))
|
||||||
|
FAIL("failed to add fd");
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (owd_eventloop_wait(&el, &id, &flags, NULL)) {
|
||||||
|
LOG_ERR("failed to wait");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (owd_event_id_eq(id, timer.id)) {
|
||||||
|
owd_eventloop_clear(&el, &timer);
|
||||||
|
printf("timer tick flags=%u\n", flags);
|
||||||
|
// break;
|
||||||
|
}
|
||||||
|
else if (owd_event_id_eq(id, pipe_ev.id)) {
|
||||||
|
char buf[1024] = { 0 };
|
||||||
|
read(pfds[0], buf, sizeof(buf) - 1);
|
||||||
|
printf("pipe event flags=%u buf=%s\n", flags, buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_ERR("unknown id");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
owd_eventloop_remove(&el, &timer);
|
||||||
|
owd_eventloop_remove(&el, &pipe_ev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
union {
|
union {
|
||||||
@@ -15,6 +83,8 @@ int main(int argc, char **argv) {
|
|||||||
struct client_conf client;
|
struct client_conf client;
|
||||||
} conf;
|
} conf;
|
||||||
|
|
||||||
|
return ev_test();
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@@ -23,6 +93,11 @@ int main(int argc, char **argv) {
|
|||||||
return !!server(&conf.server);
|
return !!server(&conf.server);
|
||||||
}
|
}
|
||||||
if (!strcmp(argv[1], "client")) {
|
if (!strcmp(argv[1], "client")) {
|
||||||
|
// TODO: proper arg parsing
|
||||||
|
if (argc < 3)
|
||||||
|
return 1;
|
||||||
|
conf.client.addr = sv_from_cstr_unbounded(argv[2]);
|
||||||
|
|
||||||
conf.client.port = DEFAULT_PORT;
|
conf.client.port = DEFAULT_PORT;
|
||||||
return !!client(&conf.client);
|
return !!client(&conf.client);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user