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