APUE Learning Example Source Code
Guo Wenxue
2018-11-03 f75a3319d1440949014dc4cd961c681fe96afe7a
Add socket program sample code
2 files added
258 ■■■■■ changed files
ch3_socket_sample/socket_client.c 119 ●●●●● patch | view | raw | blame | history
ch3_socket_sample/socket_server.c 139 ●●●●● patch | view | raw | blame | history
ch3_socket_sample/socket_client.c
New file
@@ -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);
}
ch3_socket_sample/socket_server.c
New file
@@ -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);
}