-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.c
143 lines (123 loc) · 3.4 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
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // close socket
#include <errno.h> // error codes
#include <stdbool.h> // boolean types
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <signal.h> // for interrupt signal handler
#include <sys/select.h>
#define BUFFER_SIZE 65536
int server_socket; // server socket global variable for signal handler
void check_socket(int socket)
{
if (socket < 0)
{
perror("Socket failed");
exit(EXIT_FAILURE);
}
puts("Socket created successfully!");
}
void check_connection(int socket, struct sockaddr_in address)
{
if (connect(socket, (struct sockaddr *)&address, sizeof(address)) < 0)
{
perror("Connection error");
exit(EXIT_FAILURE);
}
puts("Connected successfully!");
}
void send_message(int socket, char *message)
{
printf("dmqs$ ");
fgets(message, BUFFER_SIZE, stdin);
send(socket, message, strlen(message), 0); // sends message
}
void recv_message(int socket_fd)
{
char buffer[BUFFER_SIZE] = {0};
struct timeval tv;
tv.tv_sec = 5; // Set timeout (seconds)
tv.tv_usec = 0; // Set timeout (microseconds)
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(socket_fd, &readfds);
// Check if there is something to read within 5 seconds
int activity = select(socket_fd + 1, &readfds, NULL, NULL, &tv);
if (activity < 0)
{
perror("select error");
}
else if (activity == 0)
{
printf("recv timeout occurred. No data received.\n");
}
else
{
if (FD_ISSET(socket_fd, &readfds))
{
int num_bytes = recv(socket_fd, buffer, sizeof(buffer) - 1, 0);
if (num_bytes > 0)
{
printf("%s\n", buffer);
}
else if (num_bytes == 0)
{
printf("Server closed the connection.\n");
return; // Exit the function if server closed the connection
}
else
{
perror("recv failed");
return; // Exit the function if an error occurred
}
}
}
}
void handle_signal(int sig)
{
printf("\nCaught interrupt signal %d\n", sig);
if (close(server_socket) == 0)
{
puts("Socket closed successfully!");
exit(EXIT_SUCCESS);
}
else
{
perror("An error occurred while closing the socket");
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[])
{
if (argc < 3)
{
printf("Error - Usage: %s <IP address> <port>\n", argv[0]);
exit(EXIT_FAILURE);
}
char *ip = argv[1];
int port = atoi(argv[2]);
printf("IP address: %s - port: %d\n", ip, port);
server_socket = socket(AF_INET, SOCK_STREAM, 0);
check_socket(server_socket);
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(port);
server_address.sin_addr.s_addr = inet_addr(ip);
check_connection(server_socket, server_address);
signal(SIGINT, handle_signal);
while (true)
{
char message[BUFFER_SIZE] = {0};
memset(message, 0, sizeof(message));
send_message(server_socket, message);
printf("message: %s", message);
if (strncmp(message, "pull", 4) == 0)
recv_message(server_socket);
}
return 0;
}