Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна многопоточность, Клиент и многоточность. 
V
    Опции темы
CsandeRR
  Дата 16.5.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.4.2010

Репутация: нет
Всего: нет



Код

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "mswsock.lib")

void main(void) {
    char PCName [30], ClientName[30], Message[200];
    WSAData WSADat; // Свойства WinSock (результат функции WSAStartup)
    sockaddr_in sin; // Свойства(адрес) создаваемого сокета
    SOCKET Sock, Client; // Серверный и клиентский сокеты

    WSAStartup(0x0202,&WSADat); // Инициализация WinSock
                                // 0x0202 - версия WinSock. Может быть 1.0, 1.1, 2.0, 2.2
                                // WSADat - структура, куда будут занесены рез. инициализации
    gethostname(PCName, 30); // Получение имени текущего ПК

    sin.sin_family = AF_INET; // Тип адреса
    sin.sin_addr.s_addr = 0;  // IP-адрес сервера (пори создании сервера можно 0)
    sin.sin_port = htons(2803); // Номер порта сервера
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Создание сокета
    bind(Sock, (sockaddr*)&sin, sizeof(sin)); // Связывание созданного сокета с адресом sin

    // ***** Ожиданеи клиента
    printf("Wait of client...\n");
    
    listen(Sock, SOMAXCONN); // Прослушивание сокета сервером (для подключения клиента)
    Client = accept(Sock, (sockaddr*)&sin, 0); // Ожидание клиента
    recv(Client, ClientName, 30, 0); // Получение имени компьютера клиента
    send(Client, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (сервера)

    printf("Client ( \"%s\" ) has connected!\n", ClientName);

    // ***** Меню
    int Menu;
    do {
        printf("1. Send message;\n");
        printf("2. Get Message;\n");
        printf("3. Quit;\n");

        printf("Make your selection: ");
        scanf_s("%i", &Menu);

        switch (Menu) {
        case 1:
            // Отправка сообщения клиенту
            printf("Enter message: ");
            scanf_s("%199s", Message, 200);
            if (send(Client, Message, strlen(Message) + 1, 0) != SOCKET_ERROR)printf("Sent!\n");
            else printf("Error of sending!\n");
        break;
        case 2:
            // Приём сообщения от клиента
            if (recv(Client, Message, 200, 0) != SOCKET_ERROR) { 
                printf("%s\n", Message);
                _gettch();
            }
            else printf("Error of getting!\n");
        break;
        };

        printf("\n");
    } while (Menu != 3);

    // Закрытие сокетов и окончание работы с WinSock
    closesocket(Sock);
    closesocket(Client);
    WSACleanup();
    _gettch();
}

Есть сервер, который принимает только одного клиента, как сделать чтоб он мог принимать нескольких клиентов??
Код

//Вот клиент, если кому нужен
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "mswsock.lib")

void main(void) {
    char PCName[30], ServerName[30], Message[200], IP[16] = { 0 };
    WSAData WSADat; // Свойства WinSock (результат функции WSAStartup)
    sockaddr_in sin; // Свойства(адрес) создаваемого сокета
    SOCKET Sock; // Клиентский сокет

    // Ввод IP-адреса сервера
    printf("Enter server's IP: ");
    scanf_s("%15s", IP, 16);

    WSAStartup(0x0202, &WSADat); // Инициализация WinSock
                                 // 0x0202 - версия WinSock. Может быть 1.0, 1.1, 2.0, 2.2
                                 // WSADat - структура, куда будут занесены рез. инициализации
    gethostname(PCName, 30); // Получение имени текущего ПК

    sin.sin_family = AF_INET; // Тип адреса
    sin.sin_addr.s_addr = inet_addr(IP); // IP-адрес сервера (пори создании сервера можно 0)
    sin.sin_port = htons(2803); // Номер порта сервера

    Sock = socket(AF_INET, SOCK_STREAM, 0); // Создание сокета

    // ***** Подключение к серверу
    printf("Connecting to server...\n");

    if (connect(Sock, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) {
        printf("Connection error!\n");
        goto End;
    }
    send(Sock, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (клиента)
    recv(Sock, ServerName, 30, 0); // Получение имени компьютера сервера

    printf("Connected to \"%s\"!\n", ServerName);

    // ***** Меню
    int Menu;
    do {
        printf("1. Send message;\n");
        printf("2. Get Message;\n");
        printf("3. Quit;\n");

        printf("Make your selection: ");
        scanf_s("%i", &Menu);

        switch (Menu) {
        case 1:
            // Отправка сообщения серверу
            printf("Enter message: ");
            scanf_s("%199s", Message, 200);
            if (send(Sock, Message, strlen(Message) + 1, 0) != SOCKET_ERROR) printf("Sent!\n");
            else printf("Error of sending!\n");
        break;
        case 2:
            // Приём сообщения от сервера
            if (recv(Sock, Message, 200, 0) != SOCKET_ERROR) {
                printf("%s\n", Message);
                _gettch();
            }
            else printf("Error of getting!\n");
        break;
        };

        printf("\n");
    } while (Menu != 3);

End:

    // Закрытие сокетов и окончание работы с WinSock
    closesocket(Sock);
    WSACleanup();
    _gettch();
}


Это сообщение отредактировал(а) CsandeRR - 16.5.2010, 19:53
PM MAIL   Вверх
djamshud
Дата 16.5.2010, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



>Есть сервер, который принимает только одного клиента, как сделать чтоб он мог принимать нескольких клиентов??

Информация к размышлению. Несколько клиентов можно, а чаще правильнее обслуживать не с помощью потоков, а через пул соединений.

ЗЫ. (Это не ваш случай наверное) Часто используется разделение сервера на несколько идентичных или специализированных процессов.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
xvr
Дата 17.5.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Ваш сервер интерактивный. Как вы собираетесь в одной консоли и одним меню обрабатывать сразу несколько клиентов?
Приделать к этому потоки не сложно, а вот приделать к нескольким потокам один пользовательский интерфейс ГОРАЗДО сложнее  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.