APUE course source code
guowenxue
2 days ago 01c119252bae1e252aa9e6bdba99f1b2ee756624
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
132
133
134
135
/*********************************************************************************
 *      Copyright:  (C) 2025 LingYun IoT System Studio
 *                  All rights reserved.
 *
 *       Filename:  socket.c
 *    Description:  This file is TCP socket client example program.
 *
 *        Version:  1.0.0(10/20/2025)
 *         Author:  Guo Wenxue <guowenxue@gmail.com>
 *      ChangeLog:  1, Release initial version on "10/20/2025 09:48:51 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 = 0;
    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}
    };
 
    /* parser command line input arguments */
    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;
        }
 
    }
 
    /* socket client must specify server IP address and port */
    if( !servip || !port )
    {
        print_usage(argv[0]);
        return 1;
    }
 
    /* create TCP socket */
    conn_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(conn_fd < 0)
    {
        printf("create socket failure: %s\n", strerror(errno));
        return 2;
    }
 
    /* set server IP address and port into $server_addr */
    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 3;
    }
 
    while(1)
    {
        /* send message to socket server */
        strncpy(buf, "Hello, LingYun IoT socket server!\n", 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 */
        printf("Wating reply from socket server...\n");
        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("Receive [%d] bytes data from server: %s", rv, buf);
        printf("\n");
 
        sleep(3);
    }
 
cleanup:
    close(conn_fd);
    return 0;
}