Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2011, 01:22   #1
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
Вопрос Клиент-серверное приложение

Собственно, про что почитать, чтобы сделать такое в с++?
Гуглил, безрезультатно) Наверное, плохо гуглил.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 19.07.2011, 06:55   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

поробуйте так погуглить http://www.google.com/search?client=...hannel=suggest
p51x вне форума Ответить с цитированием
Старый 20.07.2011, 02:07   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Странная вещь - первый раз сервер получает данные, второй и третий нет, после чего клиент самопроизвольно закрывается перед выполнением команды send O_O
Скорее всего ошибка в том, что я не понимаю логику работы всего этого.

Отправляю целое число или строку. В первом байте сообщения - 'i' или 's' для чисел и строк соответственно. Потом само число (записанное не как строка в десятичной, а тупо в память, см. код), либо сама строка.

Собственно, код сервера
Код:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    int sock, listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        std::cout << "Cannot create socket\n";
        return 1;
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        std::cout << "Cannot bind\n";
        return 2;
    }

    listen(listener, 1);

    while(1)
    {
        sock = accept(listener, NULL, NULL);
        if(sock < 0)
        {
            std::cout << "Cannot accept\n";
            return 3;
        }

        bytes_read = recv(sock, buf, 1024, 0);
        std::cout << "[" << bytes_read << "]";
        switch(buf[0]){
            case 'i':
                std::cout << "[read int]: " << *(int *)(buf+1) << std::endl;
                break;
            case 's':
                std::cout << "[read str]: " << (buf+1) << std::endl;
                break;
            default:
                std::cout << "[unknown ]" << std::endl;
                break;
        };

        close(sock);
    }

    return 0;
}
Код клиента

Код:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>

int sendall(int s, char *buf, int len, int flags)
{
    int total = 0;
    int n;

    while(total < len)
    {
        n = send(s, buf+total, len-total, flags);
        if(n == -1) { break; }
        total += n;
    }

    return (n==-1 ? -1 : total);
}
char buf[1024];

int strlen(char *str){
    int res = 0;
    while(*(str++))++res;
    return res;
};

int read_str(char *message){
    char c = 0;
    int pos = 0;
    while(true){
        c = std::cin.get();
        if(c=='\n')break;
        std::cout << "Read a symbol\n";
        message[pos] = c;
        ++pos;
    };
    message[pos] = 0;
    return pos+1;
};

int main()
{

    char message[1024];

    int sock;
    struct sockaddr_in addr;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        std::cout << "Cannot create socket\n";
        return 1;
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425); // или любой другой порт...
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        std::cout << "Cannot connect\n";
        return 2;
    }

    char cs;
    bool quit = false;
    int data;
    int length;
    char c = 0;
    int pos = 0;

    while(true){
        std::cin >> cs;
        std::cin.get();
        switch(cs){
            case 'i':
                std::cout << "Integer: ";
                std::cin >> data;
                message[0] = 'i';
                *(int *)&message[1] = data;
                length = 1+sizeof(int);
                break;
            case 's':
                std::cout << "String: ";
                message[0] = 's';
                c = 0;
                pos = 1;
                while(true){
                    c = std::cin.get();
                    if(c=='\n')break;
                    message[pos] = c;
                    ++pos;
                };
                message[pos] = 0;
                length = pos+2;
                break;
            case 'q':
                std::cout << "Quit.\n";
                quit = true;
                break;
        };
        switch(message[0]){
            case 'i':
                std::cout << "[read int]: " << *(int *)(message+1) << std::endl;
                break;
            case 's':
                std::cout << "[read str]: " << (message+1) << std::endl;
                break;
            default:
                std::cout << "[unknown ]" << std::endl;
                break;
        };
        std::cout << "Bytes sent: " << sendall(sock, message, length, 0) << std::endl;
    };

    close(sock);

    return 0;
}
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
клиент-серверное приложение roxy1807 БД в Delphi 0 19.04.2011 19:02
Клиент-серверное приложение Mixim C# (си шарп) 1 25.03.2011 01:26
Клиент Серверное приложение BARNEY Общие вопросы Delphi 2 28.10.2010 09:30
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-серверное приложение veryseldom Работа с сетью в Delphi 8 20.08.2007 19:57