#include #include #include #include #include #include #include #include #include #include #include #include #if EMSCRIPTEN #include #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 (1) iter(NULL); #endif return EXIT_SUCCESS; }