From bc1dbef8e6b4944526aa60160bf5106f47909c93 Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Fri, 07 Dec 2018 20:44:24 +0800
Subject: [PATCH] add IPC named socket sample code

---
 ch6_ipc/named_socket_server.c |  100 +++++++++++++++++++++++++++++++++
 ch6_ipc/named_socket_client.c |   75 +++++++++++++++++++++++++
 2 files changed, 175 insertions(+), 0 deletions(-)

diff --git a/ch6_ipc/named_socket_client.c b/ch6_ipc/named_socket_client.c
new file mode 100644
index 0000000..65bb801
--- /dev/null
+++ b/ch6_ipc/named_socket_client.c
@@ -0,0 +1,75 @@
+/*********************************************************************************
+ *      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 <sys/un.h>
+
+#define SOCKET_PATH    "/tmp/socket.domain"
+#define MSG_STR        "Hello, Unix Domain Socket Server!"
+
+int main(int argc, char **argv)
+{
+    int                     conn_fd = -1;
+    int                     rv = -1;    
+    char                    buf[1024]; 
+    struct sockaddr_un      serv_addr;
+
+    conn_fd = socket(AF_UNIX, 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.sun_family=AF_UNIX;
+    strncpy(serv_addr.sun_path, SOCKET_PATH, sizeof(serv_addr.sun_path)-1);
+
+    if( connect(conn_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))  < 0)
+    {
+        printf("connect to unix domain socket server on \"%s\" failure: %s\n", SOCKET_PATH, strerror(errno));
+        return 0;
+    }
+    printf("connect to unix domain socket server on \"%s\" ok\n", SOCKET_PATH);
+    
+    if( write(conn_fd, MSG_STR, strlen(MSG_STR)) < 0 )
+    {
+        printf("write data to unix domain socket server on \"%s\" failure: %s\n", SOCKET_PATH, 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/ch6_ipc/named_socket_server.c b/ch6_ipc/named_socket_server.c
new file mode 100644
index 0000000..0e6b0c0
--- /dev/null
+++ b/ch6_ipc/named_socket_server.c
@@ -0,0 +1,100 @@
+/*********************************************************************************
+ *      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 <sys/un.h>
+
+#define SOCKET_PATH    "/tmp/socket.domain"
+
+int main(int argc, char **argv)
+{
+    int                     rv = -1;
+    int                     listen_fd,  client_fd = -1;
+    struct sockaddr_un      serv_addr;             
+    struct sockaddr_un      cli_addr;
+    socklen_t               cliaddr_len;
+    char                    buf[1024]; 
+    
+    //listen_fd = socket(AF_UNIX, SOCK_STREAM, 0);
+    listen_fd = socket(AF_LOCAL, 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);
+
+
+    if( !access(SOCKET_PATH, F_OK) )
+    {
+	unlink(SOCKET_PATH);
+    }
+
+    memset(&serv_addr, 0, sizeof(serv_addr));
+    serv_addr.sun_family=AF_UNIX;
+    strncpy(serv_addr.sun_path, SOCKET_PATH, sizeof(serv_addr.sun_path)-1);
+
+    if( bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )
+    {
+        printf("create socket failure: %s\n", strerror(errno));
+	unlink(SOCKET_PATH);
+        return -2;
+    }
+    printf("socket[%d] bind on path \"%s\" ok\n", listen_fd, SOCKET_PATH);
+
+    listen(listen_fd, 13); 
+    
+    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;
+        }
+
+        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);
+}
+

--
Gitblit v1.9.1