mirror of https://github.com/t1meshift/os_labs.git
93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
#include "config.h"
|
|
#include <arpa/inet.h>
|
|
#include <ctype.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
|
|
#define USAGE_STRING "Usage: %s [address [port]]\n" \
|
|
"`address' should be valid IPv4 address\n" \
|
|
"`port' should be in range [1, 65535]\n"
|
|
#define MAX(a,b) ((a)>(b)?(a):(b))
|
|
#define STR_EQ(a, b) (!strcmp((a),(b)))
|
|
#define WARNING(fmt, ...) fprintf(stderr,fmt,##__VA_ARGS__)
|
|
#define FATAL(fmt, ...) do {\
|
|
WARNING(fmt,##__VA_ARGS__);\
|
|
exit(1);\
|
|
} while (0)
|
|
|
|
int main(int argc, char *argv[]) {
|
|
struct in_addr address = {.s_addr = inet_addr("127.0.0.1")};
|
|
int port = PORT;
|
|
|
|
switch (argc) {
|
|
case 3:
|
|
port = strtol(argv[2], NULL, 10);
|
|
if (port <= 0 || port >= 0xFFFF) {
|
|
FATAL("Could not parse port\n" USAGE_STRING, argv[0]);
|
|
}
|
|
case 2:
|
|
if (!inet_aton(argv[1], &address)) {
|
|
FATAL("Could not parse IPv4 address\n" USAGE_STRING, argv[0]);
|
|
}
|
|
case 1:
|
|
break;
|
|
default:
|
|
FATAL(USAGE_STRING, argv[0]);
|
|
}
|
|
|
|
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (sockfd == -1) {
|
|
perror("socket()");
|
|
FATAL("Error while creating socket\n");
|
|
}
|
|
struct sockaddr_in srv_addr = {
|
|
.sin_family = AF_INET,
|
|
.sin_addr = address,
|
|
.sin_port = htons(port)
|
|
};
|
|
|
|
int err = connect(sockfd, (const struct sockaddr *) &srv_addr, sizeof(srv_addr));
|
|
if (err == -1) {
|
|
perror("connect()");
|
|
FATAL("Connection error.\n");
|
|
}
|
|
|
|
char buff[4096];
|
|
for (;;) {
|
|
memset(buff, 0, 4096);
|
|
printf("time - print current server time\n"
|
|
"<filepath> - print contents of the file\n"
|
|
"quit - quit client\n"
|
|
"Enter command: ");
|
|
int n = 0;
|
|
while ((buff[n++] = getchar()) != '\n');
|
|
buff[n - 1] = 0;
|
|
|
|
// Some commands should be parsed on client side
|
|
if (STR_EQ(buff, "quit")) {
|
|
break;
|
|
}
|
|
|
|
if (send(sockfd, buff, n, 0) == -1) {
|
|
perror("send()");
|
|
FATAL("Could not send data.\n");
|
|
}
|
|
|
|
memset(buff, 0, 4096);
|
|
if (recv(sockfd, buff, 4096, 0) == -1) {
|
|
perror("recv()");
|
|
FATAL("Receiving failed.\n");
|
|
}
|
|
printf("%s\n", buff);
|
|
}
|
|
|
|
close(sockfd);
|
|
return 0;
|
|
} |