Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
7 / 7 / 2
Регистрация: 10.03.2013
Сообщений: 96
1

Клиент сервер(виснет)

10.03.2013, 20:47. Показов 824. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На лабе задание сделать клиент сервер с передачей файлов.
В Visual studio когда сервер ждет коннект клиента программа виснет до того момента пока клиент не подключится.
Как избавиться от зависания(я так понимаю это связано с блокировкой сокета)?
Часть кода сервера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
                         saddr.sin_addr.S_un.S_addr=inet_addr(SystemStringToChar(IP_str));
             saddr.sin_family=AF_INET;
             saddr.sin_port=htons(i = int::Parse(Port_str));
 
             s_Listen=socket(AF_INET,SOCK_STREAM,0);
             bind(s_Listen,(SOCKADDR*)&saddr,sizeof(saddr));
             listen(s_Listen,SOMAXCONN);
             
             for(;;)
             if(s_Connect=accept(s_Listen,(SOCKADDR*)&saddr,&addrlen)){  
                 send(s_Connect,"Hello",6,NULL);
                 label6->Text="Connection was found!";
ps:это не из-за for(;.
И второй вопрос как осуществляется передача файлов , подскажите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2013, 20:47
Ответы с готовыми решениями:

Клиент-Серверное приложение. Как сделать, чтобы сервер сам отправлял сообщения на клиент
Добрый день всем. Проблема заключается в следующем: Есть клиент-серверное приложение, хочу...

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include <sys/types.h> # include <iostream> # include <winsock2.h> # include...

Клиент/сервер: клиент посылает серверу слово; определить, является ли это слово палиндромом
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и...

Взаимодействие WinCC с Labview 2013, как сервер-клиент, так и клиент-сервер
Здравствуйте. Интересует информация о взаимодействии WinCC с Labview 2013, как сервер-клиент, так и...

3
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
11.03.2013, 11:45 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    printf("wait for client...\n");
 
    int select_res = 0;
    while (true)
    {
        fd_set s_set = {1, {s}};
        timeval timeout = {0, 0};
        select_res = select(0, &s_set, 0, 0, &timeout);
        if (select_res) break;
 
        Sleep(250);
    }
    if (select_res == SOCKET_ERROR) return -1;
 
    SOCKET ns;
 
    SOCKADDR_IN nsa;
    int sizeof_nsa = sizeof(nsa);
 
    ns = accept(s, (SOCKADDR *)&nsa, &sizeof_nsa);
    if (ns == INVALID_SOCKET) return -1;
 
    printf("connected...\n");
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
    std::ifstream is;
    is.open("C:\\to_socket", std::ios::in | std::ios::binary);
    int buffer_size = sizeof_ifstream(is);
    char *buffer = new char[buffer_size];
    is.read(buffer, buffer_size);
    is.close();
    if (is.fail()) return -1;
    printf("load ok\n");
 
    if (send(s, buffer, buffer_size, 0) == SOCKET_ERROR) return -1;
    printf("send ok\n");
Добавлено через 30 секунд
C++
1
2
3
4
5
6
7
8
unsigned long sizeof_ifstream(std::ifstream &is)
{
    long p = is.tellg();
    is.seekg(0, std::ios::end);
    long res = is.tellg();
    is.seekg(p);
    return res;
}
1
7 / 7 / 2
Регистрация: 10.03.2013
Сообщений: 96
11.03.2013, 13:54  [ТС] 3
А можно пример с потоками , чтобы на каждого клиента свой поток создавался(visual c++ forms)
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
11.03.2013, 14:06 4
а зачем вам потоки? во время акцепта пополняйте список клиентов. в цикле перебирайте всех клиентов. или при акцепте запускайте поток.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static DWORD WINAPI fn(LPVOID param)
{
    SOCKET ns = *(SOCKET *)param;
 
    while (true)
    {
        делаем свое дело, когда закончим - выходим из цикла, т.к. хэндл закрыт поток уничтожится автоматически
    }
 
    ExitThread(0);
}
...
        DWORD thread_id;
        HANDLE thread_h = CreateThread
        (
            0,
            0,
            fn,
            &ns,
            0,
            &thread_id
        );
        CloseHandle(thread_h);
1
11.03.2013, 14:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2013, 14:06
Помогаю со студенческими работами здесь

Клиент-сервер в один клик!(элемет сервер, клиент)
Вот решил поделиться с вами своей идеей и её реализацией. Всегда написание Сервера и Клиента к...

Клиент-серверное приложение. Сервер - ПК, клиент - телефон (Android)
Здравствуйте, решил для обучения написать программу для выключения ПК с телефона, используя...

Передача файлов клиент-сервер-клиент используя Socket
Добрый день! Срочно нужна помощь. Мне нужно передать файлы с клиента на сервер и обратно,...

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru