From fb2ca9bfee72fa856717f98a0c4da0722fb53678 Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Tue, 23 Oct 2018 22:08:55 +0800
Subject: [PATCH] Add ch2_socket sample code
---
ch2_socket/socket_client.c | 77 +++++++++++++++++++++++++
ch2_socket/socket_server.c | 95 +++++++++++++++++++++++++++++++
2 files changed, 172 insertions(+), 0 deletions(-)
diff --git a/ch2_socket/socket_client.c b/ch2_socket/socket_client.c
new file mode 100644
index 0000000..fbe77b3
--- /dev/null
+++ b/ch2_socket/socket_client.c
@@ -0,0 +1,77 @@
+/*********************************************************************************
+ * 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
new file mode 100644
index 0000000..78c27ea
--- /dev/null
+++ b/ch2_socket/socket_server.c
@@ -0,0 +1,95 @@
+/*********************************************************************************
+ * 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);
+}
+
--
Gitblit v1.9.1