Skip to content

Instantly share code, notes, and snippets.

@jmorrill
Created March 3, 2017 01:10
Show Gist options
  • Save jmorrill/22d56ba5d75c4a1e1e4fe05eaec3e915 to your computer and use it in GitHub Desktop.
Save jmorrill/22d56ba5d75c4a1e1e4fe05eaec3e915 to your computer and use it in GitHub Desktop.
udp test for wsl
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "uv.h"
const char* probe_message = "<Envelope xmlns=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:dn=\"http://www.onvif.org/ver10/network/wsdl\">"
"<Header>"
"<wsa:MessageID xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">urn:uuid:C97CF2F7-615A-493C-88FE-7D39B94906E0</wsa:MessageID>"
"<wsa:To xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>"
"<wsa:Action xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>"
"</Header>"
"<Body>"
"<Probe xmlns=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
"<Types>dn:NetworkVideoTransmitter</Types>"
"<Scopes />"
"</Probe>"
"</Body>"
"</Envelope>";
#define CHECK(r, msg) \
if (r) { \
printf("error %d %s\n", r, msg); \
exit(1); \
}
static uv_loop_t *uv_loop;
static uv_udp_t server;
void on_recv(uv_udp_t*handle, ssize_t nread, const uv_buf_t * buf, const struct sockaddr* addr, unsigned flags)
{
printf("on recv flags %d\n", flags);
if(flags & UV_UDP_PARTIAL)
{
printf("DATA DROPPED BY OS\n");
}
if (nread > 0) {
printf("bytes read: %lu strlen %lu\n",nread, strlen((char*)buf->base));
printf("%s",buf->base);
}
}
void on_alloc(uv_handle_t* client, size_t suggested_size, uv_buf_t * buf)
{
buf->base = malloc(suggested_size);
buf->len = suggested_size;
printf("malloc:%lu %p\n",buf->len, buf->base);
}
int main(int argc,char *argv[])
{
int status;
struct sockaddr_in addr;
uv_loop = uv_default_loop();
status = uv_udp_init(uv_loop, &server);
CHECK(status,"init");
status = uv_ip4_addr("0.0.0.0", 0, &addr);
CHECK(status, "ip4_addr");
status = uv_udp_bind(&server, (const struct sockaddr *)&addr, 0);
CHECK(status,"bind");
status = uv_udp_recv_start(&server, on_alloc, on_recv);
CHECK(status,"recv");
uv_udp_send_t send_req;
uv_buf_t buffer;
buffer.base = (void*)probe_message;
buffer.len = strlen(probe_message);
struct sockaddr_in send_addr;
status = uv_ip4_addr("239.255.255.250", 3702, &send_addr);
status = uv_udp_send(&send_req, &server, &buffer, 1, (const struct sockaddr *)&send_addr, NULL);
CHECK(status,"uv_udp_send");
uv_run(uv_loop, UV_RUN_DEFAULT);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment