aboutsummaryrefslogtreecommitdiff
path: root/tests/sockets/test_sockets_partial.c
diff options
context:
space:
mode:
authorAnthony Pesch <inolen@gmail.com>2013-08-07 14:07:43 -0700
committerAnthony Pesch <inolen@gmail.com>2013-08-07 20:38:55 -0700
commit337817bf6c153f7cc2441c67dbc67ba510ed6b45 (patch)
treea8a44e10c5128906644f0d39f13f8eb8a15e9c66 /tests/sockets/test_sockets_partial.c
parentaccadc7759ca6e3690749417ef7d26d443bea5f7 (diff)
renamed socket tests
Diffstat (limited to 'tests/sockets/test_sockets_partial.c')
-rw-r--r--tests/sockets/test_sockets_partial.c119
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;
+}
+