Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Клиент
- */
- #include <stdio.h>
- #include <string.h>
- #include <assert.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h> /** inet_addr() */
- #define SERVER_PORT 8080
- #define CLIENT_PORT 8000
- int main() {
- // Создаем сокет IPPROTO_IP
- int sockfd = socket(AF_INET, SOCK_STREAM, 0);
- assert(sockfd != -1 && "Error: can't create socket");
- printf("Socket created\n");
- // Создаем локальный адрес
- struct sockaddr_in local_addr = {
- .sin_family = AF_INET,
- .sin_port = htons(CLIENT_PORT),
- .sin_addr = { .s_addr = INADDR_ANY }
- };
- int enable = 1;
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
- // Биндим сокет
- int result = bind(sockfd, (struct sockaddr *) &local_addr ,sizeof(struct sockaddr_in));
- assert(result != -1 && "Error: can't bind socket");
- printf("Socket binded\n");
- // Создаем адрес сервера
- struct sockaddr_in remote_addr = {
- .sin_family = AF_INET,
- .sin_port = htons(SERVER_PORT),
- .sin_addr = { .s_addr = inet_addr("127.0.0.1") },
- };
- result = connect(sockfd, (sockaddr*) &remote_addr, sizeof(remote_addr));
- assert(result != -1 && "Error: can't connect to server");
- printf("Connected to server\n");
- char buf[256];
- while (true) {
- // Запрашиваем пароль
- printf("Введите команду: ");
- fflush(stdout);
- //scanf("%s", buf);
- fgets(buf, 256, stdin);
- // Отправляем пароль на сервер
- send(sockfd, buf, strlen(buf), 0);
- // Получаем ответ
- int length = recv(sockfd, buf, sizeof(buf), 0);
- assert(length != -1 && "Error: can't receive message");
- buf[length] = '\0';
- printf("%s\n\n", buf);
- }
- return 0;
- }
- /**
- * Server.cpp
- */
- #include <stdio.h>
- #include <unistd.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #define PID_CHILD 0
- #define SERVER_PORT 8080
- #define CLIENT_PORT 8000
- const char password[] = "aabbcc";
- #include <unistd.h>
- #include <cstdlib>
- #include <fcntl.h>
- #include <signal.h>
- void execute(char* cmd, char* output) {
- int console = dup(1); // Делаем бекап STDOUT
- int pd[2]; //
- pipe(pd); // Заменяем STDOUT на созданный пайп
- dup2(pd[1],1); //
- dup2(pd[1],2); //
- // Вызываем команду
- int retValue = system(cmd);
- read(pd[0], output, 500);
- dup2(console, 1); // Восстанавливаем STDOUT
- }
- /**
- * Функция, в которой будут ожидаться сообщения от клиента
- * @param clientfd - сокет клиента
- */
- void listenClient(int clientfd) {
- printf("Клиент подключился\n");
- char buf[256];
- while (true) {
- int length = recv(clientfd, buf, sizeof(buf), 0);
- if (length <= 0) {
- printf("Клиент отключился\n");
- return;
- }
- buf[length] = '\0';
- char output[500] = { 0 };
- execute(buf, output);
- send(clientfd, output, strlen(output) - 1, 0);
- }
- }
- int main() {
- // Создаем сокет
- int sockfd = socket(AF_INET, SOCK_STREAM, 0);
- assert(sockfd != -1 && "Error: can't create socket");
- printf("Socket created\n");
- // Создаем локальный адрес
- struct sockaddr_in local_addr = {
- .sin_family = AF_INET,
- .sin_port = htons(SERVER_PORT),
- .sin_addr = { .s_addr = INADDR_ANY }
- };
- int enable = 1;
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
- // Биндим сокет
- int result = bind(sockfd, (struct sockaddr *) &local_addr, sizeof(local_addr));
- assert(result != -1 && "Error: can't bind socket");
- printf("Socket binded\n");
- while (true) {
- // Ожидаем подключение нового клиента
- result = listen(sockfd, 5);
- assert(result != -1 && "Error: can't listen socket");
- struct sockaddr_in client_addr = { 0 };
- socklen_t addr_len = sizeof(client_addr);
- int clientfd = accept(sockfd, (sockaddr *) &client_addr, &addr_len);
- assert(result != -1 && "Error: can't accept connection");
- int pid = fork();
- assert(pid != -1 && "Error: can't create child process");
- if (pid == PID_CHILD) {
- listenClient(clientfd);
- return 0;
- }
- }
- }
Advertisement