| /* |
| * Copyright 2013 The Emscripten Authors. All rights reserved. |
| * Emscripten is available under two separate licenses, the MIT license and the |
| * University of Illinois/NCSA Open Source License. Both these licenses can be |
| * found in the LICENSE file. |
| */ |
| |
| #include <errno.h> |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <sys/ioctl.h> |
| #include <assert.h> |
| #ifdef __EMSCRIPTEN__ |
| #include <emscripten.h> |
| #endif |
| |
| #define EXPECTED_BYTES 5 |
| #define BUFLEN 16 |
| |
| int result = 0; |
| int sock; |
| char buf[BUFLEN]; |
| char expected[] = "emscripten"; |
| struct sockaddr_in si_host, |
| si_peer; |
| struct iovec iov[1]; |
| struct msghdr hdr; |
| int done = 0; |
| |
| void iter() { |
| int n; |
| n = recvmsg(sock, &hdr, 0); |
| |
| if(0 < n) { |
| done = 1; |
| fprintf(stderr, "received %d bytes: %s", n, (char*)hdr.msg_iov[0].iov_base); |
| |
| shutdown(sock, SHUT_RDWR); |
| close(sock); |
| |
| #ifdef __EMSCRIPTEN__ |
| if(strlen((char*)hdr.msg_iov[0].iov_base) == strlen(expected) && |
| 0 == strncmp((char*)hdr.msg_iov[0].iov_base, expected, strlen(expected))) { |
| result = 1; |
| } |
| REPORT_RESULT(result); |
| exit(EXIT_SUCCESS); |
| emscripten_cancel_main_loop(); |
| #endif |
| } else if(EWOULDBLOCK != errno) { |
| perror("recvmsg failed"); |
| exit(EXIT_FAILURE); |
| emscripten_cancel_main_loop(); |
| } |
| } |
| |
| int main(void) |
| { |
| memset(&si_host, 0, sizeof(struct sockaddr_in)); |
| memset(&si_peer, 0, sizeof(struct sockaddr_in)); |
| |
| si_host.sin_family = AF_INET; |
| si_host.sin_port = htons(8991); |
| si_host.sin_addr.s_addr = htonl(INADDR_ANY); |
| |
| if(-1 == (sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP))) { |
| perror("cannot create host socket"); |
| exit(EXIT_FAILURE); |
| } |
| |
| if(-1 == bind(sock, (struct sockaddr*)&si_host, sizeof(struct sockaddr))) { |
| perror("cannot bind host socket"); |
| exit(EXIT_FAILURE); |
| } |
| |
| iov[0].iov_base = buf; |
| iov[0].iov_len = sizeof(buf); |
| |
| memset (&hdr, 0, sizeof (struct msghdr)); |
| |
| hdr.msg_name = &si_peer; |
| hdr.msg_namelen = sizeof(struct sockaddr_in); |
| hdr.msg_iov = iov; |
| hdr.msg_iovlen = 1; |
| |
| #ifdef __EMSCRIPTEN__ |
| emscripten_set_main_loop(iter, 0, 0); |
| #else |
| while (!done) iter(); |
| #endif |
| |
| return EXIT_SUCCESS; |
| } |