aboutsummaryrefslogtreecommitdiff
path: root/tests/websockets_gethostbyname.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/websockets_gethostbyname.c')
-rw-r--r--tests/websockets_gethostbyname.c114
1 files changed, 60 insertions, 54 deletions
diff --git a/tests/websockets_gethostbyname.c b/tests/websockets_gethostbyname.c
index 1580d9a7..59c55ba1 100644
--- a/tests/websockets_gethostbyname.c
+++ b/tests/websockets_gethostbyname.c
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <fcntl.h>
#include <sys/ioctl.h>
#if EMSCRIPTEN
#include <emscripten.h>
@@ -14,10 +15,17 @@
#define EXPECTED_BYTES 5
-int SocketFD;
+int sockfd;
-unsigned int get_all_buf(int sock, char* output, unsigned int maxsize)
-{
+void finish(int result) {
+ close(sockfd);
+#if EMSCRIPTEN
+ REPORT_RESULT();
+#endif
+ exit(result);
+}
+
+unsigned int get_all_buf(int sock, char* output, unsigned int maxsize) {
int bytes;
if (ioctl(sock, FIONREAD, &bytes)) return 0;
if (bytes == 0) return 0;
@@ -27,28 +35,42 @@ unsigned int get_all_buf(int sock, char* output, unsigned int maxsize)
unsigned int offset = 0;
while((errno = 0, (n = recv(sock, buffer, sizeof(buffer), 0))>0) ||
errno == EINTR) {
- if(n>0)
- {
- if (((unsigned int) n)+offset > maxsize) { fprintf(stderr, "too much data!"); exit(EXIT_FAILURE); }
+ if (n > 0) {
+ if (((unsigned int) n)+offset > maxsize) {
+ fprintf(stderr, "too much data!");
+ finish(EXIT_FAILURE);
+ }
memcpy(output+offset, buffer, n);
offset += n;
}
}
- if(n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
- fprintf(stderr, "error in get_all_buf!");
- exit(EXIT_FAILURE);
+ if (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
+ perror("error in get_all_buf!");
+ finish(EXIT_FAILURE);
}
return offset;
}
-int done = 0;
-
void iter() {
- /* perform read write operations ... */
static char out[1024*2];
static int pos = 0;
- int n = get_all_buf(SocketFD, out+pos, 1024-pos);
+ fd_set fdr;
+ int res;
+
+ // make sure that sockfd has finished connecting and is ready to read
+ FD_ZERO(&fdr);
+ FD_SET(sockfd, &fdr);
+ res = select(64, &fdr, NULL, NULL, NULL);
+ if (res == -1) {
+ perror("select failed");
+ finish(EXIT_FAILURE);
+ } else if (!FD_ISSET(sockfd, &fdr)) {
+ return;
+ }
+
+ // perform read write operations ...
+ int n = get_all_buf(sockfd, out+pos, 1024-pos);
if (n) printf("read! %d\n", n);
pos += n;
if (pos >= EXPECTED_BYTES) {
@@ -58,73 +80,57 @@ void iter() {
sum += out[i];
}
- shutdown(SocketFD, SHUT_RDWR);
+ shutdown(sockfd, SHUT_RDWR);
- close(SocketFD);
-
- done = 1;
+ close(sockfd);
printf("sum: %d\n", sum);
-#if EMSCRIPTEN
- int result = sum;
- REPORT_RESULT();
-#endif
+ finish(sum);
}
}
-int main(void)
-{
- struct sockaddr_in stSockAddr;
- int Res;
- SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+int main() {
+ struct sockaddr_in addr;
+ int res;
- if (-1 == SocketFD)
- {
+ sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (sockfd == -1) {
perror("cannot create socket");
- exit(EXIT_FAILURE);
+ finish(EXIT_FAILURE);
}
+ fcntl(sockfd, F_SETFL, O_NONBLOCK);
- memset(&stSockAddr, 0, sizeof(stSockAddr));
-
- stSockAddr.sin_family = AF_INET;
- stSockAddr.sin_port = htons(7001);
-
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(SOCKK);
struct hostent *host0 = gethostbyname("test.com"); // increment hostname counter to check for possible but at 0,0 not differentiating low/high
struct hostent *host = gethostbyname("localhost");
- char **addr_list = host->h_addr_list;
- int *addr = (int*)*addr_list;
- printf("raw addr: %d\n", *addr);
+ char **raw_addr_list = host->h_addr_list;
+ int *raw_addr = (int*)*raw_addr_list;
+ printf("raw addr: %d\n", *raw_addr);
char name[INET_ADDRSTRLEN];
- if (!inet_ntop(AF_INET, addr, name, sizeof(name))) {
+ if (!inet_ntop(AF_INET, raw_addr, name, sizeof(name))) {
printf("could not figure out name\n");
- return 0;
+ finish(EXIT_FAILURE);
}
printf("localhost has 'ip' of %s\n", name);
- Res = inet_pton(AF_INET, name, &stSockAddr.sin_addr);
-
- if (0 > Res) {
- perror("error: first parameter is not a valid address family");
- close(SocketFD);
- exit(EXIT_FAILURE);
- } else if (0 == Res) {
- perror("char string (second parameter does not contain valid ipaddress)");
- close(SocketFD);
- exit(EXIT_FAILURE);
+ if (inet_pton(AF_INET, name, &addr.sin_addr) != 1) {
+ perror("inet_pton failed");
+ finish(EXIT_FAILURE);
}
- if (-1 == connect(SocketFD, (struct sockaddr *)&stSockAddr, sizeof(stSockAddr))) {
+ res = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
+ if (res == -1 && errno != EINPROGRESS) {
perror("connect failed");
- close(SocketFD);
- exit(EXIT_FAILURE);
-
+ finish(EXIT_FAILURE);
}
#if EMSCRIPTEN
emscripten_set_main_loop(iter, 0, 0);
#else
- while (!done) iter();
+ while (1) iter();
#endif
return EXIT_SUCCESS;