-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.c
152 lines (127 loc) · 3.38 KB
/
client.c
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include "error.h"
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
// global variable
char *SERVER_HOST_NAME = "127.0.0.1";
int SERVER_HOST_PORT_NO = 8080;
int client_socket;
char buffer_received[1024];
// function declaration
char *get_cpu_info();
char *get_cpu_info_v2();
// function defination
void action1() {
char *content = get_cpu_info_v2();
send(client_socket, content, strlen(content), 0);
printf("send completed, size = %d\n", strlen(content));
}
void show_option() {
printf("<1> case 1\n");
printf("<2> case 2\n");
printf("<3> case 3\n");
printf("<4> case 4\n");
}
// main entrance
int main() {
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = INADDR_ANY;
client_addr.sin_port = htons(0);
// create a socket
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
fail("create client socket fail");
}
struct sockaddr_in server_addr;
bzero((char *)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
struct hostent *server;
server = gethostbyname(SERVER_HOST_NAME);
if (server == NULL) {
fail("fail to get host name");
}
bcopy((char *)server->h_addr, (char *)&server_addr.sin_addr.s_addr,
server->h_length);
server_addr.sin_port = htons(atoi("8080"));
socklen_t server_addr_len = sizeof(server_addr);
// set the nonblocking mode
int mode = 1;
ioctl(client_socket, FIONBIO, &mode); //设为非阻塞式
printf("connecting to %s, port=%d\n", inet_ntoa(server_addr.sin_addr.s_addr),
server_addr.sin_port);
if (connect(client_socket, (struct sockaddr *)&server_addr,
server_addr_len) == -1) {
fail("connent to server fail");
}
// set input nonblocking
int flags;
if ((flags = fcntl(STDOUT_FILENO, F_GETFL, 0)) == -1) {
perror("fcntl F_GETFL fail:");
exit(1);
}
flags |= O_NONBLOCK;
if (fcntl(STDOUT_FILENO, F_SETFL, flags) == -1) {
perror("fcntl F_SETFL fail:");
exit(1);
}
printf("please input your choice:\n");
show_option();
while (1) {
// 1. input
char c = getchar();
if (c != -1) {
switch (c) {
case '1':
action1();
printf("1 procedrue\n");
break;
case '\n':
show_option();
break;
default:
printf("invalid choice!");
break;
}
} else {
// fail("key input failed");
}
// 2. socket
memset(buffer_received, '\0', 1024);
int length_received =
recv(client_socket, buffer_received, sizeof(buffer_received), 0);
if (length_received <= 0) {
// fail("receive fail");
continue;
}
buffer_received[length_received] = '\0';
printf("get bytes length: %d,content:%s\n", length_received,
buffer_received);
}
close(client_socket);
return 0;
}
char *get_cpu_info() {
FILE *cpuinfo = fopen("/proc/cpuinfo", "rb");
char *config = "\0";
size_t size = 0;
while (getdelim(&config, &size, 0, cpuinfo) != -1) {
puts(config);
}
fclose(cpuinfo);
return config;
}
char buffer[1024];
char *get_cpu_info_v2() {
int cpu_num = sysconf(_SC_NPROCESSORS_CONF);
sprintf(buffer, "cpu num = %d\n", cpu_num);
return buffer;
}