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