@@ -9,14 +9,15 @@
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <poll.h>
#include <arpa/inet.h>
+#include "helpers.h"
#include "liburing.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static int recv_thread_ready = 0;
static int recv_thread_done = 0;
@@ -46,36 +47,37 @@ struct data {
unsigned short port;
unsigned int addr;
int stop;
};
static void *send_thread(void *arg)
{
+ struct sockaddr_in addr;
struct data *data = arg;
+ int s0;
wait_for_var(&recv_thread_ready);
- int s0 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ s0 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert(s0 != -1);
- struct sockaddr_in addr;
-
addr.sin_family = AF_INET;
addr.sin_port = data->port;
addr.sin_addr.s_addr = data->addr;
if (connect(s0, (struct sockaddr*)&addr, sizeof(addr)) != -1)
wait_for_var(&recv_thread_done);
close(s0);
return 0;
}
void *recv_thread(void *arg)
{
+ struct sockaddr_in addr = { };
struct data *data = arg;
struct io_uring_sqe *sqe;
struct io_uring ring;
int i, ret;
ret = io_uring_queue_init(8, &ring, 0);
assert(ret == 0);
@@ -85,35 +87,25 @@ void *recv_thread(void *arg)
int32_t val = 1;
ret = setsockopt(s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(ret != -1);
ret = setsockopt(s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(ret != -1);
- struct sockaddr_in addr;
-
addr.sin_family = AF_INET;
data->addr = inet_addr("127.0.0.1");
addr.sin_addr.s_addr = data->addr;
- i = 0;
- do {
- data->port = htons(1025 + (rand() % 64510));
- addr.sin_port = data->port;
-
- if (bind(s0, (struct sockaddr*)&addr, sizeof(addr)) != -1)
- break;
- } while (++i < 100);
-
- if (i >= 100) {
- fprintf(stderr, "Can't find good port, skipped\n");
+ if (t_bind_ephemeral_port(s0, &addr)) {
+ perror("bind");
data->stop = 1;
signal_var(&recv_thread_ready);
- goto out;
+ goto err;
}
+ data->port = addr.sin_port;
ret = listen(s0, 128);
assert(ret != -1);
signal_var(&recv_thread_ready);
sqe = io_uring_get_sqe(&ring);
@@ -154,15 +146,14 @@ void *recv_thread(void *arg)
(uint64_t) cqe->user_data, cqe->res,
data->expected[idx]);
goto err;
}
io_uring_cqe_seen(&ring, cqe);
}
-out:
signal_var(&recv_thread_done);
close(s0);
io_uring_queue_exit(&ring);
return NULL;
err:
signal_var(&recv_thread_done);
close(s0);