Gistrec icon

Linux simple TCP chat via fork

Gistrec | PRO | 05/14/19 08:00:06 AM UTC | 0 ⭐ | 811 👁️ | Never ⏰ | []
C++ |

4.4 KB

|

None

|

0 👍

/

0 👎

#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";
 
 
/**
 * Функция, в которой будут ожидаться сообщения от клиента
 * @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';
 
        if (strncmp(buf, password, strlen(password)) != 0) {
            // Пароль не правильный
            printf("Пароль не верный: %s\n", buf);
 
            sprintf(buf, "Пароль не верный");
            send(clientfd, buf, strlen(buf), 0);
        }else {
            printf("Пароль верный: %s\n", buf);
 
            sprintf(buf, "Пароль верный");
            send(clientfd, buf, strlen(buf), 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 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;
        }
    }
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#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 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);
 
        // Отправляем пароль на сервер
        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("[SERVER] %s\n", buf);
    }
 
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎