diff options
Diffstat (limited to 'tests/sockets/test_sockets_partial.c')
-rw-r--r-- | tests/sockets/test_sockets_partial.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/tests/sockets/test_sockets_partial.c b/tests/sockets/test_sockets_partial.c new file mode 100644 index 00000000..5fe34721 --- /dev/null +++ b/tests/sockets/test_sockets_partial.c @@ -0,0 +1,119 @@ +#include <errno.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <assert.h> +#if EMSCRIPTEN +#include <emscripten.h> +#endif + +int sockfd = -1; +int sum = 0; + +void finish(int result) { + close(sockfd); +#if EMSCRIPTEN + REPORT_RESULT(); +#endif + exit(result); +} + +void iter(void *arg) { + char buffer[1024]; + char packetLength; + fd_set fdr; + int i; + int res; + + // make sure that sockfd 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; + } + + res = recv(sockfd, buffer, 1, 0); + if (res == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return; //try again + } + + perror("unexcepted end of data"); + finish(EXIT_FAILURE); + } + + if (res != 1) { + perror("should read 1 byte"); + finish(EXIT_FAILURE); + } + + packetLength = buffer[0]; + res = recv(sockfd, buffer, packetLength, 0); + + printf("got %d,%d\n", res, packetLength); + + if (res != packetLength) { + fprintf(stderr, "lost packet data, expected: %d readed: %d", packetLength, res); + finish(EXIT_FAILURE); + } + + for (i = 0; i < packetLength; ++i) { + if (buffer[i] != i+1) { + fprintf(stderr, "packet corrupted, expected: %d, actual: %d", i+1, buffer[i]); + finish(EXIT_FAILURE); + } + + sum += buffer[i]; + } + + if (packetLength == buffer[0]) { // \x01\x01 - end marker + printf("sum: %d\n", sum); + finish(sum); + } +} + +int main() { + struct sockaddr_in addr; + int res; + + sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + if (sockfd == -1) { + perror("cannot create socket"); + exit(EXIT_FAILURE); + } + fcntl(sockfd, F_SETFL, O_NONBLOCK); + + 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(sockfd, (struct sockaddr *)&addr, sizeof(addr)); + if (res == -1 && errno != EINPROGRESS) { + perror("connect failed"); + finish(EXIT_FAILURE); + } + +#if EMSCRIPTEN + emscripten_set_main_loop(iter, 0, 0); +#else + while (!done) iter(NULL); +#endif + + return EXIT_SUCCESS; +} + |