From f75a3319d1440949014dc4cd961c681fe96afe7a Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Sat, 03 Nov 2018 17:18:31 +0800
Subject: [PATCH] Add socket program sample code

---
 ch3_socket_sample/socket_client.c |  119 +++++++++++++++++++++++
 ch3_socket_sample/socket_server.c |  139 +++++++++++++++++++++++++++
 2 files changed, 258 insertions(+), 0 deletions(-)

diff --git a/ch3_socket_sample/socket_client.c b/ch3_socket_sample/socket_client.c
new file mode 100644
index 0000000..642de2d
--- /dev/null
+++ b/ch3_socket_sample/socket_client.c
@@ -0,0 +1,119 @@
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h> 
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#define MSG_STR "Hello LingYun IoT Studio\n"
+
+void print_usage(char *progname)
+{
+	printf("%s usage: \n", progname);
+	printf("-i(--ipaddr): sepcify server IP address\n");
+	printf("-p(--port): sepcify server port.\n");
+	printf("-h(--Help): print this help information.\n");
+
+	return ;
+}
+
+int main(int argc, char **argv)
+{
+	int                  sockfd = -1;
+	int                  rv = -1;
+	struct sockaddr_in   servaddr;
+	char                *servip = NULL;
+	int                  port = 0;
+	char                 buf[1024];
+	int                  ch;
+       	struct option        opts[] = {
+		{"ipaddr", required_argument, NULL, 'i'},
+		{"port", required_argument, NULL, 'p'},
+		{"help", no_argument, NULL, 'h'},
+		{NULL, 0, NULL, 0}
+	};
+
+	while( (ch=getopt_long(argc, argv, "i:p:h", opts, NULL)) != -1 ) 
+	{
+		switch(ch)
+		{
+			case 'i':
+				servip=optarg;
+				break;
+
+			case 'p':
+				port=atoi(optarg);
+				break;
+
+			case 'h':
+				print_usage(argv[0]);
+				return 0;
+		}
+
+	}
+
+	if( !servip || !port )
+	{
+		print_usage(argv[0]);
+		return 0;
+	}
+
+
+	sockfd=socket(AF_INET, SOCK_STREAM, 0);
+	if(sockfd < 0)
+	{
+		printf("Create socket failure: %s\n", strerror(errno));
+		return -1;
+	}
+	printf("Create socket[%d] successfully!\n", sockfd);
+
+	memset(&servaddr, 0, sizeof(servaddr));
+	servaddr.sin_family=AF_INET;
+	servaddr.sin_port = htons(port);
+	inet_aton(servip, &servaddr.sin_addr);
+	rv=connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
+	if(rv < 0)
+	{
+		printf("Connect to server[%s:%d] failure: %s\n", 
+				servip, port, strerror(errno));
+		return -2;
+	}
+
+	printf("Connect to server[%s:%d] successfully!\n", servip, port);
+
+	while(1)
+	{ 
+		rv=write(sockfd, MSG_STR, strlen(MSG_STR));
+	       	if(rv < 0)
+	       	{
+		       	printf("Write to server by sockfd[%d] failure: %s\n", 
+					sockfd, strerror(errno));
+			break;
+	       	}
+
+		memset(buf, 0, sizeof(buf));
+		rv=read(sockfd, buf, sizeof(buf));
+	       	if( rv < 0)
+	       	{
+		       	printf("Read data from server by sockfd[%d] failure: %s\n", 
+					sockfd, strerror(errno));
+			break;
+	       	}
+	       	else if( rv == 0)
+	       	{ 
+			printf("Socket[%d] get disconnected\n", sockfd);
+			break;
+		}
+		else if( rv > 0 )
+		{
+			printf("Read %d bytes data from Server: %s\n", 
+					rv, buf);
+		}
+	}
+
+
+	close(sockfd);
+}
diff --git a/ch3_socket_sample/socket_server.c b/ch3_socket_sample/socket_server.c
new file mode 100644
index 0000000..4b373a4
--- /dev/null
+++ b/ch3_socket_sample/socket_server.c
@@ -0,0 +1,139 @@
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h> 
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#define MSG_STR "Hello LingYun IoT Studio Client\n"
+
+void print_usage(char *progname)
+{
+	printf("%s usage: \n", progname);
+	printf("-p(--port): sepcify server listen port.\n");
+	printf("-h(--Help): print this help information.\n");
+
+	return ;
+}
+
+int main(int argc, char **argv)
+{
+	int                  sockfd = -1;
+	int                  rv = -1;
+	struct sockaddr_in   servaddr;
+	struct sockaddr_in   cliaddr;
+	socklen_t            len;
+	int                  port = 0;
+	char                 buf[1024];
+	int                  clifd;
+	int                  ch;
+	int                  on = 1;
+
+       	struct option        opts[] = {
+		{"port", required_argument, NULL, 'p'},
+		{"help", no_argument, NULL, 'h'},
+		{NULL, 0, NULL, 0}
+	};
+
+	while( (ch=getopt_long(argc, argv, "p:h", opts, NULL)) != -1 ) 
+	{
+		switch(ch)
+		{
+			case 'p':
+				port=atoi(optarg);
+				break;
+
+			case 'h':
+				print_usage(argv[0]);
+				return 0;
+		}
+
+	}
+
+	if( !port )
+	{
+		print_usage(argv[0]);
+		return 0;
+	}
+
+	sockfd=socket(AF_INET, SOCK_STREAM, 0);
+	if(sockfd < 0)
+	{
+		printf("Create socket failure: %s\n", strerror(errno));
+		return -1;
+	}
+	printf("Create socket[%d] successfully!\n", sockfd);
+
+	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+
+	memset(&servaddr, 0, sizeof(servaddr));
+	servaddr.sin_family=AF_INET;
+	servaddr.sin_port = htons(port);
+	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
+	//inet_aton("192.168.0.16", &servaddr.sin_addr);
+
+	rv=bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
+	if(rv < 0)
+	{
+		printf("Socket[%d] bind on port[%d] failure: %s\n", 
+				sockfd, port, strerror(errno));
+		return -2;
+	}
+
+	listen(sockfd, 13);
+	printf("Start to listen on port [%d]\n", port);
+
+	while(1)
+	{ 
+		printf("Start accept new client incoming...\n");
+
+		clifd=accept(sockfd, (struct sockaddr *)&cliaddr, &len);
+		if(clifd < 0)
+		{
+			printf("Accept new client failure: %s\n", strerror(errno));
+			continue;
+		}
+
+		printf("Accept new client[%s:%d] successfully\n", 
+				inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
+
+		memset(buf, 0, sizeof(buf));
+		rv=read(clifd, buf, sizeof(buf));
+	       	if( rv < 0)
+	       	{
+		       	printf("Read data from client sockfd[%d] failure: %s\n", 
+					clifd, strerror(errno));
+			close(clifd);
+			continue;
+	       	}
+	       	else if( rv == 0)
+	       	{ 
+			printf("Socket[%d] get disconnected\n", clifd);
+			close(clifd);
+			continue;
+		}
+		else if( rv > 0 )
+		{
+			printf("Read %d bytes data from Server: %s\n", 
+					rv, buf);
+		}
+
+		rv=write(clifd, MSG_STR, strlen(MSG_STR));
+	       	if(rv < 0)
+	       	{
+		       	printf("Write to client by sockfd[%d] failure: %s\n", 
+					sockfd, strerror(errno));
+			close(clifd);
+			continue;
+	       	}
+
+		printf("Close client socket[%d]\n", clifd);
+		close(clifd);
+	}
+
+
+	close(sockfd);
+}

--
Gitblit v1.9.1