/********** Client Side Code **********/ int getResponse(noPollConn * conn, int requestLen, int index) { noPollMsg * msg; int count = 0; uint64_t beginTime = GetTime(); int msglen = 0; while (true) { count++; msg = nopoll_conn_get_msg(conn); if (msg != NULL) { noPollOpCode code = nopoll_msg_opcode(msg); if (!((code == NOPOLL_BINARY_FRAME) || (code == NOPOLL_CONTINUATION_FRAME))) { LogPrintf("Received unexpected message type %d", code); return -1; } msglen += nopoll_msg_get_payload_size(msg); DebugPrintf("Retrieved message %d frag %d:%d of size %d (collected %d of %d)", index, nopoll_msg_is_fragment(msg), nopoll_msg_is_final(msg), nopoll_msg_get_payload_size(msg), msglen, requestLen); if (nopoll_msg_is_final(msg) && (msglen != requestLen)) { DebugPrintf("Final flag set arbitrarily??"); } if (msglen == requestLen) { if (!nopoll_msg_is_final(msg)) DebugPrintf("Final flag not set??"); break; } nopoll_msg_unref(msg); } if (!nopoll_conn_is_ok(conn)) { LogPrintf("Client disconnected!!"); return -1; } nopoll_sleep(100); } DebugPrintf("Retrieved full message %d in %d ms looped: %d", index, (int) (GetTime() - beginTime), count); if (msglen != requestLen) { LogPrintf("Received invalid response length %d != %d", msglen, requestLen); return -1; } nopoll_msg_unref(msg); return 0; }
nopoll_bool test_sending_and_check_echo (noPollConn * conn, const char * label, const char * msg) { char buffer[1024]; int length = strlen (msg); int bytes_read; /* wait for the reply */ while (nopoll_true) { if (nopoll_conn_is_ready (conn)) break; nopoll_sleep (10000); } /* end if */ /* send content text(utf-8) */ printf ("%s: sending content..\n", label); if (nopoll_conn_send_text (conn, msg, length) != length) { printf ("ERROR: Expected to find proper send operation..\n"); return nopoll_false; } /* wait for the reply (try to read 1024, blocking and with a 3 seconds timeout) */ bytes_read = nopoll_conn_read (conn, buffer, length, nopoll_true, 3000); if (bytes_read > 0) buffer[bytes_read] = 0; if (bytes_read != length) { printf ("ERROR: expected to find 14 bytes but found %d..\n", bytes_read); return nopoll_false; } /* end if */ /* check content received */ if (! nopoll_cmp (buffer, msg)) { printf ("ERROR: expected to find message 'This is a test' but something different was received: '%s'..\n", buffer); return nopoll_false; } /* end if */ printf ("%s: received reply and echo matches..\n", label); /* return that we sent and received the echo reply */ return nopoll_true; }
void* webSocketery() { noPollCtx *ctx = nopoll_ctx_new(); noPollMsg *msg; noPollRole *role = nopoll_conn_role(NOPOLL_ROLE_UNKNOWN); struct noPollHandshake *fetch; noPollConnOpts *opts; /* Comment the log lines to disable loging Debug Warnings and Critical errors (Better not)*/ //nopoll_log_color_enable(ctx, true); //nopoll_log_enable(ctx, nopoll_true); /* Initializing the cookie options */ opts = nopoll_conn_opts_new(); if (!ctx) puts("error ctx is nill"); //To add Cookies use this method below /* nopoll_conn_opts_set_cookie(opts, "BAYEUX_BROWSER=56a9-mchhnynonz6ji8a6hs1sh49; JSESSIONID=8gz8e00htqrl15vcm3o9yi95f"); */ // Websocketery Works for mtgox and others servers but not for m.zpush.ovh it keeps rejecting me for an unknown f*****g 400 error ! Use Methods below to connect to server, a working example is provided //nopoll_conn_new(ctx, ip, port, host, get, protocols, origin) nopoll_conn_new_opts(ctx, opts, ip, port, host, get, protocols, origin)// //noPollConn *conn = nopoll_conn_new(ctx , "54.171.156.38" ,"80" ,"m.zpush.ovh:8080" ,"ws://m.zpush.ovh:8080/str/strd" ,NULL, "Authorize"); noPollConn *conn = nopoll_conn_new(ctx, "54.238.149.121", "80", "websocket.mtgox.com", "/mtgox", NULL, "chat"); if (!nopoll_conn_wait_until_connection_ready(conn, 50) ) { puts("nopoll_conn failed, timeout"); return (0);} if (nopoll_conn_send_text (conn, "hello how are you doing, do we connect ?", 40) != 40) {puts("send text just failed...."); return(0);} else { while (! nopoll_conn_is_ready (conn)) { if (! nopoll_conn_is_ok (conn)) { printf ("ERROR (4.1 jkd412): expected to find proper connection handshake finished, but found connection is broken: session=%d, errno=%d : %s..\n", (int) nopoll_conn_socket (conn), errno, strerror (errno)); return nopoll_false; } /* end if */ /* wait a bit 10ms */ nopoll_sleep (10000); } /* end if */ nopoll_conn_close (conn); /* finish */ nopoll_ctx_unref (ctx); puts("nopoll conn sucess"); while (nopoll_true) { if (nopoll_conn_is_ready(conn)) { puts("break"); break; } nopoll_sleep(10000); } msg = nopoll_conn_get_msg(conn); if (msg) printf("Msg received = %s\n", nopoll_msg_get_payload(msg)); if (!nopoll_conn_is_ok(conn)) { puts("------------ Connection Dead ----------------"); return nopoll_false; } } nopoll_ctx_unref(ctx); return (0); }
void listener_on_message (noPollCtx * ctx, noPollConn * conn, noPollMsg * msg, noPollPtr user_data) { const char * content = (const char *) nopoll_msg_get_payload (msg); FILE * file = NULL; char buffer[1024]; int bytes; int sent; char example[100]; int shown; noPollMsg * aux; nopoll_bool dont_reply = nopoll_false; FILE * open_file_cmd = NULL; int iterator; char * ref; /* check for open file commands */ if (nopoll_ncmp (content, "open-file: ", 11)) { #if defined(NOPOLL_OS_WIN32) open_file_cmd = fopen (content + 11, "ab"); #else open_file_cmd = fopen (content + 11, "a"); #endif if (open_file_cmd == NULL) { printf ("ERROR: unable to open file: %s\n", content + 11); return; } /* end if */ /* set handler */ nopoll_conn_set_on_msg (conn, write_file_handler, open_file_cmd); return; } /* end if */ /* printf ("Message received: %s\n", content); */ if (nopoll_ncmp (content, "close with message", 18)) { printf ("Listener: RELEASING connection (closing it) with reason..\n"); nopoll_conn_close_ext (conn, 1048, "Hey, this is a very reasonable error message", 44); return; } /* end if */ if (nopoll_ncmp (content, "release-message", 15)) { printf ("Listener: RELEASING previous message..\n"); nopoll_msg_unref (previous_msg); previous_msg = NULL; return; } /* end if */ if (nopoll_ncmp (content, "get-cookie", 10)) { printf ("Listener: reporting cookie: %s\n", nopoll_conn_get_cookie (conn)); nopoll_conn_send_text (conn, nopoll_conn_get_cookie (conn), strlen (nopoll_conn_get_cookie (conn))); return; } /* printf ("Checking for set-broken socket: %s\n", content); */ if (nopoll_ncmp (content, "set-broken-socket", 17)) { printf ("Listener: setting broken socket on conn: %p (socket=%d)\n", conn, (int) nopoll_conn_socket (conn)); nopoll_conn_shutdown (conn); return; } /* end if */ if (nopoll_ncmp (content, "get-connection-close-count", 26)) { printf ("Sending reply to report connection close...\n"); ref = nopoll_strdup_printf ("%d", connection_close_count); nopoll_conn_send_text (conn, ref, strlen (ref)); nopoll_free (ref); return; } /* end if */ if (nopoll_ncmp (content, "1234-1) ", 8)) { printf ("Listener: waiting a second to force buffer flooding..\n"); nopoll_sleep (100000); dont_reply = nopoll_true; } /* end if */ /* get initial bytes */ bytes = nopoll_msg_get_payload_size (msg); shown = bytes > 100 ? 99 : bytes; memset (example, 0, 100); /* if (! nopoll_msg_is_fragment (msg)) */ memcpy (example, (const char *) nopoll_msg_get_payload (msg), shown); printf ("Listener received (size: %d, ctx refs: %d): (first %d bytes, fragment: %d) '%s'\n", nopoll_msg_get_payload_size (msg), nopoll_ctx_ref_count (ctx), shown, nopoll_msg_is_fragment (msg), example); if (nopoll_cmp (content, "ping")) { /* send a ping */ nopoll_conn_send_ping (conn); return; } else if (nopoll_cmp (content, "get-file")) { iterator = 0; file = NULL; while (nopoll_true) { #if defined(NOPOLL_OS_WIN32) file = fopen ("nopoll-regression-client.c", "rb"); #else file = fopen ("nopoll-regression-client.c", "r"); #endif printf ("LISTENER: file pointer (%p, errno=%d : %s)..\n", file, errno, strerror (errno)); if (file) break; iterator++; if (iterator > 3) { printf ("ERROR: failed to open nopoll-regression-client.c (fopen call failed)\n"); nopoll_conn_shutdown (conn); return; } /* end if */ } /* end while */ while (! feof (file)) { /* read content */ bytes = fread (buffer, 1, 1024, file); /* send content */ if (bytes > 0) { /* send content and get the result */ /* printf ("Sending message with %d bytes..\n", bytes); */ /* nopoll_log_enable (ctx, nopoll_true); */ while (nopoll_true) { /* try to send content */ sent = nopoll_conn_send_text (conn, buffer, bytes); /* nopoll_log_enable (ctx, nopoll_false); */ if (sent != bytes) { if (errno == NOPOLL_EWOULDBLOCK) { nopoll_sleep (1000); /* printf (" ..retrying..sending message with %d bytes..\n", bytes); */ continue; } /* end if */ printf ("ERROR: expected to send %d bytes but sent different content size (%d bytes), errno=%d (%d)..\n", bytes, sent, errno, NOPOLL_EWOULDBLOCK); } /* end if */ break; } } /* end if */ /* next */ } /* end while */ /* now close the handle */ fclose (file); return; } /* end if */ /* check if we have to reply */ if (dont_reply) return; if (nopoll_msg_is_fragment (msg)) { printf ("Found fragment, FIN = %d (%p)?..\n", nopoll_msg_is_final (msg), msg); /* call to join this message */ aux = previous_msg; previous_msg = nopoll_msg_join (previous_msg, msg); nopoll_msg_unref (aux); if (! nopoll_msg_is_final (msg)) { printf ("Found fragment that is not final..\n"); printf ("Not replying because frame fragment received..\n"); return; } /* end if */ printf ("Found final fragment, replying with complete content: %s (refs: %d)..\n", (const char *) nopoll_msg_get_payload (previous_msg), nopoll_msg_ref_count (previous_msg)); /* ok, now found final piece, replying */ nopoll_conn_send_text (conn, (const char *) nopoll_msg_get_payload (previous_msg), nopoll_msg_get_payload_size (previous_msg)); /* release reference */ nopoll_msg_unref (previous_msg); previous_msg = NULL; return; } /* send reply as received */ printf ("Sending reply... (same message size: %d)\n", nopoll_msg_get_payload_size (msg)); nopoll_conn_send_text (conn, (const char *) nopoll_msg_get_payload (msg), nopoll_msg_get_payload_size (msg)); return; }