From d241def81514078e2f3650218781bc4353c4d4bd Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Mon, 06 Nov 2023 16:53:10 +0800
Subject: [PATCH] update TCP/UDP socket example code

---
 /dev/null                   |   95 -----------
 ch2_socket/socktcp_server.c |  111 +++++++++++++
 ch2_socket/sockudp_client.c |   78 +++++++++
 ch2_socket/makefile         |   10 +
 ch2_socket/socktcp_client.c |   90 +++++++++++
 ch2_socket/sockudp_server.c |   86 ++++++++++
 6 files changed, 375 insertions(+), 95 deletions(-)

diff --git a/ch2_socket/makefile b/ch2_socket/makefile
new file mode 100644
index 0000000..c93fdc8
--- /dev/null
+++ b/ch2_socket/makefile
@@ -0,0 +1,10 @@
+SRCFILES = $(wildcard *.c)
+BINARIES=$(SRCFILES:%.c=%)
+
+all: ${BINARIES}
+
+%: %.c 
+	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
+
+clean:
+	rm -f ${BINARIES}
diff --git a/ch2_socket/socket_client.c b/ch2_socket/socket_client.c
deleted file mode 100644
index fbe77b3..0000000
--- a/ch2_socket/socket_client.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*********************************************************************************
- *      Copyright:  (C) 2018 LingYun IoT Studio
- *                  All rights reserved.
- *
- *       Filename:  socket_client.c
- *    Description:  This file is socket client sample source code, it will connect
- *                  socket server and send to/receive from it.
- *                 
- *        Version:  1.0.0(10/23/2018)
- *         Author:  Guo Wenxue <guowenxue@gmail.com>
- *      ChangeLog:  1, Release initial version on "2018-10-23 01:38:08 PM"
- *                 
- ********************************************************************************/
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#define SERVER_IP          "127.0.0.1"
-#define SERVER_PORT        8889
-#define MSG_STR            "Hello, Unix Network Program World!"
-
-int main(int argc, char **argv)
-{
-    int                     conn_fd = -1;
-    int                     rv = -1;    
-    char                    buf[1024]; 
-    struct sockaddr_in      serv_addr;
-
-    conn_fd = socket(AF_INET, SOCK_STREAM, 0);
-    if(conn_fd < 0)
-    {
-        printf("create socket failure: %s\n", strerror(errno));
-        return -1;
-    }
-
-    memset(&serv_addr, 0, sizeof(serv_addr));
-    serv_addr.sin_family = AF_INET;
-    serv_addr.sin_port = htons(SERVER_PORT);
-    inet_aton( SERVER_IP, &serv_addr.sin_addr );
-
-    if( connect(conn_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))  < 0)
-    {
-        printf("connect to server [%s:%d] failure: %s\n", SERVER_IP, SERVER_PORT, strerror(errno));
-        return 0;
-    }
-    
-    if( write(conn_fd, MSG_STR, strlen(MSG_STR)) < 0 )
-    {
-        printf("Write data to server [%s:%d] failure: %s\n", SERVER_IP, SERVER_PORT, strerror(errno));
-	goto cleanup;
-    }
-    
-    memset(buf, 0, sizeof(buf));
-    rv = read(conn_fd, buf, sizeof(buf));    
-    if(rv < 0)
-    {
-	    printf("Read data from server failure: %s\n", strerror(errno));
-	    goto cleanup;
-    }
-    else if( 0 == rv )
-    {
-	    printf("Client connect to server get disconnected\n");
-	    goto cleanup;
-    }
-
-    printf("Read %d bytes data from server: '%s'\n", rv, buf);
-
-
-cleanup:
-    close(conn_fd);
-}
-
diff --git a/ch2_socket/socket_server.c b/ch2_socket/socket_server.c
deleted file mode 100644
index 78c27ea..0000000
--- a/ch2_socket/socket_server.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*********************************************************************************
- *      Copyright:  (C) 2018 LingYun IoT Studio
- *                  All rights reserved.
- *
- *       Filename:  socket_server.c
- *    Description:  This file is socket server sample source code, it will echo back
- *                  the receive data from client.
- *                 
- *        Version:  1.0.0(10/23/2018)
- *         Author:  Guo Wenxue <guowenxue@gmail.com>
- *      ChangeLog:  1, Release initial version on "2017-10-23 01:41:05 PM"
- *                 
- ********************************************************************************/
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#define LISTEN_PORT          8889
-#define BACKLOG              13
-
-int main(int argc, char **argv)
-{
-    int                     rv = -1;
-    int                     listen_fd,  client_fd = -1;
-    struct sockaddr_in      serv_addr;             
-    struct sockaddr_in      cli_addr;
-    socklen_t               cliaddr_len;
-    char                    buf[1024]; 
-    
-    listen_fd = socket(AF_INET, SOCK_STREAM, 0);
-    if(listen_fd < 0 )
-    {
-        printf("create socket failure: %s\n", strerror(errno));
-        return -1;
-    }
-    printf("socket create fd[%d]\n", listen_fd);
-
-    memset(&serv_addr, 0, sizeof(serv_addr));
-    serv_addr.sin_family = AF_INET;        
-    serv_addr.sin_port = htons(LISTEN_PORT);
-    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-    if( bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )
-    {
-        printf("create socket failure: %s\n", strerror(errno));
-        return -2;
-    }
-    printf("socket[%d] bind on port[%d] for all IP address ok\n", listen_fd, LISTEN_PORT);
-
-    listen(listen_fd, BACKLOG); 
-    
-    while(1)   
-    {
-        printf("\nStart waiting and accept new client connect...\n", listen_fd);
-        client_fd = accept(listen_fd, (struct sockaddr*)&cli_addr, &cliaddr_len);
-        if(client_fd < 0)
-        {
-            printf("accept new socket failure: %s\n", strerror(errno));
-            return -2;
-        }
-        printf("Accept new client[%s:%d] with fd [%d]\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), client_fd);
-
-
-        memset(buf, 0, sizeof(buf));        
-        if( (rv=read(client_fd, buf, sizeof(buf))) < 0)
-	{
-		printf("Read data from client socket[%d] failure: %s\n", client_fd, strerror(errno));
-		close(client_fd);
-		continue;
-	}
-	else if( rv == 0 )
-	{
-		printf("client socket[%d] disconnected\n", client_fd);
-		close(client_fd);
-		continue;
-	}
-	printf("read %d bytes data from client[%d] and echo it back: '%s'\n", rv, client_fd, buf);
-
-	if( write(client_fd, buf, rv) < 0 )
-	{
-	       	printf("Write %d bytes data back to client[%d] failure: %s\n", rv, client_fd, strerror(errno));
-		close(client_fd);
-	}
-	
-        sleep(1);
-        close(client_fd); 
-    } 
-    close(listen_fd);
-}
-
diff --git a/ch2_socket/socktcp_client.c b/ch2_socket/socktcp_client.c
new file mode 100644
index 0000000..2040cf6
--- /dev/null
+++ b/ch2_socket/socktcp_client.c
@@ -0,0 +1,90 @@
+/*********************************************************************************
+ *		Copyright:	(C) 2018 LingYun IoT Studio
+ *					All rights reserved.
+ *
+ *		 Filename:	socktcp_client.c
+ *	  Description:	This file is TCP socket client example source code.
+ *				
+ *		  Version:	1.0.0(10/23/2018)
+ *		   Author:	Guo Wenxue <guowenxue@gmail.com>
+ *		ChangeLog:	1, Release initial version on "2018-10-23 01:38:08 PM"
+ *				
+ ********************************************************************************/
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define SERVER_IP		   "127.0.0.1"
+#define SERVER_PORT		   8889
+
+
+int main(int argc, char **argv)
+{
+	int						conn_fd = -1;
+	int						rv = -1;	
+	char					buf[1024];
+	struct sockaddr_in		serv_addr;
+	float					temp;
+
+	/* create TCP socket */
+	conn_fd = socket(AF_INET, SOCK_STREAM, 0);
+	if(conn_fd < 0)
+	{
+		printf("create socket failure: %s\n", strerror(errno));
+		return -1;
+	}
+
+	/* set socket server information */
+	memset(&serv_addr, 0, sizeof(serv_addr));
+	serv_addr.sin_family = AF_INET;
+	serv_addr.sin_port = htons(SERVER_PORT);
+	inet_aton( SERVER_IP, &serv_addr.sin_addr );
+
+	/* connect to socket server */
+	if( connect(conn_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))	< 0)
+	{
+		printf("connect to server [%s:%d] failure: %s\n", SERVER_IP, SERVER_PORT, strerror(errno));
+		return 0;
+	}
+
+	while(1)
+	{
+		/* send message to socket server */
+		strncpy(buf, "Hello, LingYun IoT socket server!", sizeof(buf));
+		if( write(conn_fd, buf, strlen(buf)) < 0 )
+		{
+			printf("Write data to server [%s:%d] failure: %s\n", SERVER_IP, SERVER_PORT, strerror(errno));
+			goto cleanup;
+		}
+		printf("Send message to socket server okay\n");
+
+		/* receive message from socket server */
+		memset(buf, 0, sizeof(buf));
+		printf("Wating reply from socket server...\n");
+		rv = read(conn_fd, buf, sizeof(buf));	
+		if(rv < 0)
+		{
+			printf("Read data from server failure: %s\n", strerror(errno));
+			goto cleanup;
+		}
+		else if( 0 == rv )
+		{
+			printf("Client connect to server get disconnected\n");
+			goto cleanup;
+		}
+		printf("Receive [%d] bytes data from server: %s", rv, buf);
+		printf("\n");
+
+		sleep(3);
+	}
+
+cleanup:
+	close(conn_fd);
+	return 0;
+}
diff --git a/ch2_socket/socktcp_server.c b/ch2_socket/socktcp_server.c
new file mode 100644
index 0000000..17ab23c
--- /dev/null
+++ b/ch2_socket/socktcp_server.c
@@ -0,0 +1,111 @@
+/*********************************************************************************
+ *		Copyright:	(C) 2018 LingYun IoT Studio
+ *					All rights reserved.
+ *
+ *		 Filename:	socket_server.c
+ *	  Description:	This file is TCP socket server example source code.
+ *				
+ *		  Version:	1.0.0(10/23/2018)
+ *		   Author:	Guo Wenxue <guowenxue@gmail.com>
+ *		ChangeLog:	1, Release initial version on "2017-10-23 01:41:05 PM"
+ *				
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define LISTEN_PORT			 8889
+#define BACKLOG				 13
+
+int main(int argc, char **argv)
+{
+	int						rv = -1;
+	int						listen_fd,	client_fd = -1;
+	struct sockaddr_in		serv_addr;			
+	struct sockaddr_in		cli_addr;
+	socklen_t				addr_len = sizeof(cli_addr);
+	char					buf[1024];
+	int						reuse = 1;
+
+	/* create TCP socket */
+	listen_fd = socket(AF_INET, SOCK_STREAM, 0);
+	if(listen_fd < 0 )
+	{
+		printf("create socket failure: %s\n", strerror(errno));
+		return -1;
+	}
+	printf("socket create fd[%d]\n", listen_fd);
+
+	/* Fix port can not be used when stop server program and run it again immediately. */
+	setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
+
+	/* bind socket server information */
+	memset(&serv_addr, 0, sizeof(serv_addr));
+	serv_addr.sin_family = AF_INET;		
+	serv_addr.sin_port = htons(LISTEN_PORT);
+	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+	if( bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )
+	{
+		printf("create socket failure: %s\n", strerror(errno));
+		return -2;
+	}
+	printf("socket[%d] bind on port[%d] for all IP address ok\n", listen_fd, LISTEN_PORT);
+
+	/* start listen socket */
+	listen(listen_fd, BACKLOG);
+
+	while(1)
+	{
+		/* accept new incoming socket client  */
+		printf("\nStart waiting and accept new client connect...\n");
+		client_fd = accept(listen_fd, (struct sockaddr*)&cli_addr, &addr_len);
+		if(client_fd < 0)
+		{
+			printf("accept new socket failure: %s\n", strerror(errno));
+			return -2;
+		}
+		printf("Accept new client[%s:%d] with fd [%d]\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), client_fd);
+
+		while(1)
+		{
+			/* receive message from socket client */
+			memset(buf, 0, sizeof(buf));		
+			if( (rv=read(client_fd, buf, sizeof(buf))) < 0)
+			{
+				printf("Read data from client socket[%d] failure: %s\n", client_fd, strerror(errno));
+				close(client_fd);
+				break;
+			}
+			else if( rv == 0 )
+			{
+				printf("client socket[%d] disconnected\n", client_fd);
+				close(client_fd);
+				break;
+			}
+
+			printf("Read [%d] bytes data from socket client[%d]: %s\n", rv, client_fd, buf);
+
+			/* send message to socket client */
+			printf("Reply back to socket client...\n");
+			snprintf(buf, sizeof(buf), "Hello, socket client [%s:%d]\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
+			if( write(client_fd, buf, strlen(buf)) < 0 )
+			{
+				printf("Reply back to socket client[%d] failure: %s\n", client_fd, strerror(errno));
+				close(client_fd);
+			}
+			printf("\n");
+		}
+
+		close(client_fd);
+	}
+
+	close(listen_fd);
+	return 0;
+}
+
diff --git a/ch2_socket/sockudp_client.c b/ch2_socket/sockudp_client.c
new file mode 100644
index 0000000..ebe318b
--- /dev/null
+++ b/ch2_socket/sockudp_client.c
@@ -0,0 +1,78 @@
+/*********************************************************************************
+ *		Copyright:	(C) 2018 LingYun IoT Studio
+ *					All rights reserved.
+ *
+ *		 Filename:	sockudp_client.c
+ *	  Description:	This file is UDP socket client example source code.
+ *
+ *		  Version:	1.0.0(10/23/2018)
+ *		   Author:	Guo Wenxue <guowenxue@gmail.com>
+ *		ChangeLog:	1, Release initial version on "2018-10-23 01:38:08 PM"
+ *
+ ********************************************************************************/
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define SERVER_IP		   "127.0.0.1"
+#define SERVER_PORT		   8890
+
+
+int main(int argc, char **argv)
+{
+	int						sockfd = -1;
+	int						rv = -1;
+	char					buf[1024];
+	struct sockaddr_in		serv_addr;
+	socklen_t				addrlen = sizeof(serv_addr);
+	float					temp;
+
+	/* create UDP socket */
+	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+	if(sockfd < 0)
+	{
+		printf("create socket failure: %s\n", strerror(errno));
+		return -1;
+	}
+
+	/* set socket server information  */
+	memset(&serv_addr, 0, sizeof(serv_addr));
+	serv_addr.sin_family = AF_INET;
+	serv_addr.sin_port = htons(SERVER_PORT);
+	inet_aton( SERVER_IP, &serv_addr.sin_addr );
+
+	while(1)
+	{
+		/* send message to socket server */
+		strncpy(buf, "Hello, LingYun IoT socket server!", sizeof(buf));
+		if( sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&serv_addr, addrlen) < 0 )
+		{
+			printf("Write data to server [%s:%d] failure: %s\n", SERVER_IP, SERVER_PORT, strerror(errno));
+			break;
+		}
+		printf("Send message to socket server okay\n");
+
+		/* receive message from socket server */
+		memset(buf, 0, sizeof(buf));
+		printf("Wating reply from socket server...\n");
+		rv = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&serv_addr, &addrlen);
+		if(rv < 0)
+		{
+			printf("Read data from server failure: %s\n", strerror(errno));
+			break;
+		}
+		printf("Receive [%d] bytes data from server: %s", rv, buf);
+		printf("\n");
+
+		sleep(3);
+	}
+
+	close(sockfd);
+	return 0;
+}
diff --git a/ch2_socket/sockudp_server.c b/ch2_socket/sockudp_server.c
new file mode 100644
index 0000000..56166d1
--- /dev/null
+++ b/ch2_socket/sockudp_server.c
@@ -0,0 +1,86 @@
+/*********************************************************************************
+ *		Copyright:	(C) 2018 LingYun IoT Studio
+ *					All rights reserved.
+ *
+ *		 Filename:	socket_server.c
+ *	  Description:	This file is UDP socket server example source code.
+ *				
+ *		  Version:	1.0.0(10/23/2018)
+ *		   Author:	Guo Wenxue <guowenxue@gmail.com>
+ *		ChangeLog:	1, Release initial version on "2017-10-23 01:41:05 PM"
+ *				
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define LISTEN_PORT			 8890
+#define BACKLOG				 13
+
+int main(int argc, char **argv)
+{
+	int						rv = -1;
+	int						sockfd;
+	struct sockaddr_in		serv_addr;			
+	struct sockaddr_in		cli_addr;
+	socklen_t				addr_len = sizeof(cli_addr);
+	char					buf[1024];
+	int						reuse = 1;
+
+	/* create UDP socket */
+	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+	if(sockfd < 0 )
+	{
+		printf("create socket failure: %s\n", strerror(errno));
+		return -1;
+	}
+	printf("socket create fd[%d]\n", sockfd);
+
+	/* fix port can not be used when stop server program and run it again immediately */
+	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
+
+	/* bind socket server information */
+	memset(&serv_addr, 0, sizeof(serv_addr));
+	serv_addr.sin_family = AF_INET;		
+	serv_addr.sin_port = htons(LISTEN_PORT);
+	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+	if( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )
+	{
+		printf("create socket failure: %s\n", strerror(errno));
+		return -2;
+	}
+	printf("socket[%d] bind on port[%d] for all IP address ok\n", sockfd, LISTEN_PORT);
+
+	while(1)
+	{
+		/* receive message from socket client */
+		memset(buf, 0, sizeof(buf));		
+		if( (rv=recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&cli_addr, &addr_len)) < 0)
+		{
+			printf("Read data from socket[%d] failure: %s\n", sockfd, strerror(errno));
+			break;
+		}
+		printf("Read [%d] bytes data from client[%s:%d]: %s\n",
+				rv, inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), buf);
+
+		/* send message to socket client */
+		printf("Reply back to socket client...\n");
+		snprintf(buf, sizeof(buf), "Hello, socket client [%s:%d]\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
+		if( (rv=sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&cli_addr, addr_len)) < 0)
+		{
+			printf("Reply back to socket client[%d] failure: %s\n", sockfd, strerror(errno));
+			break;
+		}
+		printf("\n");
+	}
+
+	close(sockfd);
+	return 0;
+}
+

--
Gitblit v1.9.1