3
#include <sys/socket.h>
4
#include <netinet/in.h>
11
#include <sys/ioctl.h>
14
#include <emscripten.h>
17
#include "test_sockets_msg.h"
19
// message to send to the server
21
#define MESSAGE "pingtothepong"
40
void finish(int result) {
51
void main_loop(void *arg) {
52
static char out[1024*2];
58
// make sure that server.fd is ready to read / write
61
FD_SET(server.fd, &fdr);
62
FD_SET(server.fd, &fdw);
63
res = select(64, &fdr, &fdw, NULL, NULL);
65
perror("select failed");
69
if (server.state == MSG_READ) {
70
if (!FD_ISSET(server.fd, &fdr)) {
74
// as a test, confirm with ioctl that we have data available
77
res = ioctl(server.fd, FIONREAD, &available);
81
res = do_msg_read(server.fd, &server.msg, echo_read, 0, NULL, NULL);
83
perror("server closed");
85
} else if (res != -1) {
89
// once we've read the entire message, validate it
90
if (echo_read >= server.msg.length) {
91
assert(!strcmp(server.msg.buffer, MESSAGE));
95
if (!FD_ISSET(server.fd, &fdw)) {
99
res = do_msg_write(server.fd, &echo_msg, echo_wrote, 0, NULL, 0);
101
perror("server closed");
102
finish(EXIT_FAILURE);
103
} else if (res != -1) {
107
// once we're done writing the message, read it back
108
if (echo_wrote >= echo_msg.length) {
109
server.state = MSG_READ;
115
struct sockaddr_in addr;
118
memset(&server, 0, sizeof(server_t));
119
server.state = MSG_WRITE;
121
// setup the message we're going to echo
122
memset(&echo_msg, 0, sizeof(msg_t));
123
echo_msg.length = strlen(MESSAGE) + 1;
124
echo_msg.buffer = malloc(echo_msg.length);
125
strncpy(echo_msg.buffer, MESSAGE, echo_msg.length);
127
// create the socket and set to non-blocking
129
server.fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
131
server.fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
133
if (server.fd == -1) {
134
perror("cannot create socket");
135
finish(EXIT_FAILURE);
137
fcntl(server.fd, F_SETFL, O_NONBLOCK);
139
// connect the socket
140
memset(&addr, 0, sizeof(addr));
141
addr.sin_family = AF_INET;
142
addr.sin_port = htons(SOCKK);
143
if (inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr) != 1) {
144
perror("inet_pton failed");
145
finish(EXIT_FAILURE);
148
res = connect(server.fd, (struct sockaddr *)&addr, sizeof(addr));
149
if (res == -1 && errno != EINPROGRESS) {
150
perror("connect failed");
151
finish(EXIT_FAILURE);
155
emscripten_set_main_loop(main_loop, 0, 0);
157
while (1) main_loop(NULL);
b'\\ No newline at end of file'