forked from Poco-Ye/rtl-btmp_tool
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmp_skt.c
106 lines (89 loc) · 2.77 KB
/
mp_skt.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
#include <stdio.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
static void help(void)
{
printf("mp_client usage: ./mp_client IP\n");
}
int main (int argc, char **argv)
{
char serv_ip[32];
int sk_fd;
struct sockaddr_in serv_addr;
fd_set rfds, wfds;
char cmdline[128];
char rbuf[128];
int fd_num;
int wait_read = 0;
int ret;
/* check argc */
if (argc != 2) {
help();
return -1;
}
snprintf(serv_ip, sizeof(serv_ip), "%s", argv[1]);
reconnect:
/* TCP client */
sk_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sk_fd < 0) {
printf("failed to create socket: %s(%d)\n", strerror(errno), errno);
return -1;
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_port = htons(6666);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(serv_ip);
if (connect(sk_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("failed to connect socket: %s(%d)\n", strerror(errno), errno);
return -1;
}
printf("\nMP client test tool\n");
while (1) {
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_SET(sk_fd, &rfds);
FD_SET(sk_fd, &wfds);
fd_num = select(sk_fd + 1, &rfds, &wfds, NULL, NULL);
if (fd_num > 0) {
/* read fd has higher priority */
if (FD_ISSET(sk_fd, &rfds)) {
memset(rbuf, '\0', 128);
ret = read(sk_fd, rbuf, sizeof(rbuf));
if (ret > 0) {
wait_read = 0;
printf("< %s\n", rbuf);
}
}
if (wait_read == 1) {
//printf("DEBUG: check wait_read to be 1\n");
continue;
}
memset(cmdline, '\0', 128);
/* cmd prompt */
printf("> ");
fflush(stdout);
fgets(cmdline, 128, stdin);
if (cmdline[0] == '\0' || cmdline[0] == '\n')
continue;
else if (!strncmp(cmdline, "close", 5)) {
printf("DEBUG: close sk_fd %d\n", sk_fd);
//shutdown(sk_fd, SHUT_RDWR);
close(sk_fd);
goto reconnect;
} else if (cmdline[strlen(cmdline)-1] == '\n')
cmdline[strlen(cmdline)-1] = '\0'; /* remove linefeed */
if (FD_ISSET(sk_fd, &wfds)) {
ret = write(sk_fd, cmdline, strlen(cmdline));
if (ret == strlen(cmdline)) {
//printf("DEBUG: set wait_read to 1\n");
wait_read = 1; /* any cmd should have a response */
}
}
}
}
return 0;
}