[haiku-commits] Change in haiku[master]: tests/network: add tcp non-blocking client based on tcp_client.c

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 3 May 2020 08:59:56 +0000

From Jérôme Duval <jerome.duval@xxxxxxxxx>:

Jérôme Duval has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/2557 ;)


Change subject: tests/network: add tcp non-blocking client based on tcp_client.c
......................................................................

tests/network: add tcp non-blocking client based on tcp_client.c

test #2967
---
A src/tests/system/network/tcp_client_non_blocking.c
1 file changed, 117 insertions(+), 0 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/57/2557/1

diff --git a/src/tests/system/network/tcp_client_non_blocking.c 
b/src/tests/system/network/tcp_client_non_blocking.c
new file mode 100644
index 0000000..36bfc9b
--- /dev/null
+++ b/src/tests/system/network/tcp_client_non_blocking.c
@@ -0,0 +1,117 @@
+/*
+ * a stream socket client demo
+ */
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <netdb.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+
+#define PORT 1234              // the port client will be connecting to
+#define MAXDATASIZE 100        // max number of bytes we can get at once
+
+
+int
+main(int argc, char **argv)
+{
+       int sockfd;
+       char buffer[MAXDATASIZE];
+       short int port = PORT;
+       struct hostent *he;
+       struct sockaddr_in their_addr;
+               // connector's address information
+       struct sockaddr_in peer;
+       socklen_t peerlen = (socklen_t)sizeof(peer);
+
+
+       if (argc < 2) {
+               fprintf(stderr,"usage: tcp_client <hostname> [port]\n");
+               exit(1);
+       }
+
+       if (argc == 3)
+               port = atoi(argv[2]);
+
+       if ((he = gethostbyname(argv[1])) == NULL) {
+               // get the host info
+               perror("gethostbyname");
+               exit(1);
+       }
+
+       if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+               perror("socket");
+               exit(1);
+       }
+
+       fcntl(sockfd, F_SETFD, FD_CLOEXEC);
+       fcntl(sockfd, F_GETFL);
+       fcntl(sockfd, F_SETFL, O_NONBLOCK | O_RDWR);
+
+       memset(&their_addr, 0, sizeof(their_addr));
+       their_addr.sin_family = AF_INET;
+       their_addr.sin_port = htons(port);
+       their_addr.sin_addr = *((struct in_addr *)he->h_addr);
+
+       if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct 
sockaddr)) == -1) {
+               if (errno != EINPROGRESS) {
+                       perror("connect");
+                       exit(1);
+               }
+               sleep(1);
+
+               if (connect(sockfd, (struct sockaddr *)&their_addr, 
sizeof(struct sockaddr)) == -1) {
+                       if (errno != EISCONN) {
+                               perror("connect 2");
+                               exit(1);
+                       }
+               }
+
+       }
+
+       if (getpeername(sockfd, (struct sockaddr *)&peer, &peerlen) != 0) {
+               printf("Expected success from getpeername, got %d\n", errno);
+               exit(1);
+       }
+
+       if (!fork()) {
+               int numBytes;
+
+               while (1) {
+                       // child process
+                       if ((numBytes = recv(sockfd, buffer, sizeof(buffer) - 
1, 0)) == -1) {
+                               perror("recv");
+                               sleep(1);
+                               // want the read thread to stay alive
+                               continue;
+                       }
+
+                       buffer[numBytes] = '\0';
+                       printf("%s", buffer);
+               }
+       } else {
+               while (1) {
+                       // parent process
+                       if (fgets(buffer, sizeof(buffer) - 1, stdin) == NULL) {
+                               perror("fgets");
+                               exit(1);
+                       }
+
+                       if ((send(sockfd, buffer, strlen(buffer), 0)) == -1) {
+                               perror("send");
+                               exit(1);
+                       }
+               }
+       }
+
+       close(sockfd);
+
+       return 0;
+}
+

--
To view, visit https://review.haiku-os.org/c/haiku/+/2557
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Ib3b309adebb5e76c501045dd0f6333bc9a2b17bd
Gerrit-Change-Number: 2557
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: tests/network: add tcp non-blocking client based on tcp_client.c - Gerrit