void rig_pb_stream_set_websocket_client_fd(rig_pb_stream_t *stream, int fd) { c_return_if_fail(stream->type == STREAM_TYPE_DISCONNECTED); stream->type = STREAM_TYPE_WEBSOCKET_CLIENT; stream->websocket_client.socket = fd; #warning "FIXME: support multiple websocket based streams" /* XXX: These are global callbacks and so is the user data * so we need some way to lookup a stream based on a * socket fd within the callbacks */ emscripten_set_socket_error_callback(stream /* user data */, rig_pb_stream_websocket_error_cb); emscripten_set_socket_open_callback(stream /* user data */, rig_pb_stream_websocket_ready_cb); emscripten_set_socket_message_callback(stream /* user data */, rig_pb_stream_websocket_ready_cb); set_connected(stream); }
int main() { struct sockaddr_in addr; int res; memset(&server, 0, sizeof(server_t)); server.state = MSG_WRITE; // setup the message we're going to echo memset(&echo_msg, 0, sizeof(msg_t)); echo_msg.length = strlen(MESSAGE) + 1; echo_msg.buffer = malloc(echo_msg.length); strncpy(echo_msg.buffer, MESSAGE, echo_msg.length); echo_read = 0; echo_wrote = 0; // create the socket and set to non-blocking #if !TEST_DGRAM server.fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); #else server.fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); #endif if (server.fd == -1) { perror("cannot create socket"); finish(EXIT_FAILURE); } fcntl(server.fd, F_SETFL, O_NONBLOCK); // connect the socket memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(SOCKK); if (inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr) != 1) { perror("inet_pton failed"); finish(EXIT_FAILURE); } res = connect(server.fd, (struct sockaddr *)&addr, sizeof(addr)); if (res == -1 && errno != EINPROGRESS) { perror("connect failed"); finish(EXIT_FAILURE); } { int z; struct sockaddr_in adr_inet; socklen_t len_inet = sizeof adr_inet; z = getsockname(server.fd, (struct sockaddr *)&adr_inet, &len_inet); if (z != 0) { perror("getsockname"); finish(EXIT_FAILURE); } char buffer[1000]; sprintf(buffer, "%s:%u", inet_ntoa(adr_inet.sin_addr), (unsigned)ntohs(adr_inet.sin_port)); // TODO: This is not the correct result: We should have a auto-bound address char *correct = "0.0.0.0:0"; printf("got (expected) socket: %s (%s), size %d (%d)\n", buffer, correct, strlen(buffer), strlen(correct)); assert(strlen(buffer) == strlen(correct)); assert(strcmp(buffer, correct) == 0); } { int z; struct sockaddr_in adr_inet; socklen_t len_inet = sizeof adr_inet; z = getpeername(server.fd, (struct sockaddr *)&adr_inet, &len_inet); if (z != 0) { perror("getpeername"); finish(EXIT_FAILURE); } char buffer[1000]; sprintf(buffer, "%s:%u", inet_ntoa(adr_inet.sin_addr), (unsigned)ntohs(adr_inet.sin_port)); char correct[1000]; sprintf(correct, "127.0.0.1:%u", SOCKK); printf("got (expected) socket: %s (%s), size %d (%d)\n", buffer, correct, strlen(buffer), strlen(correct)); assert(strlen(buffer) == strlen(correct)); assert(strcmp(buffer, correct) == 0); } #ifdef __EMSCRIPTEN__ #if TEST_ASYNC // The first parameter being passed is actually an arbitrary userData pointer // for simplicity this test just passes a basic char* emscripten_set_socket_error_callback("error", error_callback); emscripten_set_socket_open_callback("open", async_main_loop); emscripten_set_socket_message_callback("message", async_main_loop); #else emscripten_set_main_loop(main_loop, 60, 0); #endif #else while (1) main_loop(); #endif return EXIT_SUCCESS; }