APUE Learning Example Source Code
guowenxue
2023-11-06 14bbb45d375b611d19494874996e94aad64cf912
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*********************************************************************************
 *      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 <stdlib.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>
#include <getopt.h>
 
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                     conn_fd = -1;
    int                     rv = -1;
    char                    buf[1024];
    char                   *servip = "127.0.0.1";
    int                     port = 8889;
    struct sockaddr_in      serv_addr;
    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;
    }
 
    /* 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(port);
    inet_aton( servip, &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", servip, 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", servip, 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;
}