Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
1

TServerSocket прием большого буфера от клиента. Как лучше реализовать?

08.03.2015, 01:02. Показов 619. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не знаю, как в названии темы описать свой вопрос.
Клиент сделан на обычных сокетах (winsock2.h), тогда как сервер сделан в RAD Studio с соответствующими компонентами, которые несколько отличаются от шиндосувской библиотеки.
А теперь вопрос: как на многопользовательском сервере организовать нормальную передачу данных (файлов и тд)? Чтобы остальные сокеты, например, в событии OnRead не перекрывались, как здесь. Там весь процесс передачи сделан на булевой переменной, которая перенаправляет принимаемые данные в TMemoryStream, а это не годится для моего сервера. Ведь во время передачи данных другой клиент может присоединиться к серверу, и его первичная информация (некоторые данные о компе) пойдут в файл.
В общем, у меня уже немножко крыша едет. Хочу организовать это хорошо, чтоб без всяких сбоев и поэтому прошу помощи здесь.
Была идея сокет вынести в отдельный поток, где его буду обрабатывать. Но как без события OnRead принимать данные? Функция ReceiveText() вернет текст сразу (пустую строку ) а я ее, как дурак, буду пытаться парсить на размер файла и тд.

Хотелось написать покороче, а получилось как всегда. Не пинайте, уж очень много мыслей.

Добавлено через 1 минуту
И да, перешлет ли большие данные обычная функция send? Т.е. она сработает так же, как и SendBuf в XE* компонентах? Просто вызов - и ждешь пока клиент все сплавит серверу?

Добавлено через 5 минут
Есть идея конечно это все дело так же в событии обрабатывать, проверяя например входящий сокет на схожесть с сокетом, через который мы сейчас передаем данные (типа записать его куда-нибудь).

Добавлено через 3 часа 17 минут
Я не понимаю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Structure{
    SOCKET socket;
    TMemoryStream *MS;
};
 
DWORD WINAPI ReceiveData(LPVOID St){
    AnsiString Text;
    Structure s = *(Structure*)St;
    TMemoryStream *MS = s.MS;
    int MSize = 0;
    recv(s.socket, Text.c_str(), sizeof(Text), 0);
    Form30->Console->Lines->Add("MSize: " + Text);
    MSize = StrToInt(Text);
    while(MS->Size < MSize){
        recv(s.socket, Text.c_str(), sizeof(Text), 0);
        MS->Write(Text.c_str(), Text.Length());
    }
    MS->Position = 0;
    Form30->Console->Lines->Add((String)"Data: " + (int)MS->Memory);
    delete MS;
}
Все это в потоке. Пытаюсь просто передать число (ну, для начала), но функция recv срабатывает сразу же, даже не получая ни одного байта. И пытается пустую строку впихнуть в StrToInt, что вызывает ошибку, хотя клиент не посылает ничего.
Это такие особенности билдера? Насколько мне известно, функция recv завершается при получении хотя бы одного байта от сокета и возвращает это количество байт, а тут хрень полная...

Добавлено через 4 минуты
Под структуру (Structure) я закидываю TCustomWinSocket->SocketHandle, по идее это и нужно присваивать типу SOCKET. Но все равно recv возвращает -1 А это, как я понял, возвращается только при потере связи.
Короче, беда какая-то.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2015, 01:02
Ответы с готовыми решениями:

Как лучше реализовать прием без запроса Mnea с GPS модуля
Привет всем извиняюсь за нубский вопрос запоял законнектил gps модуль ГПС FGPMMOPA6B к компу...

Как лучше реализовать подключение второго клиента к первому?
Ситуация: 2 клиента, сервер, TCP, т.к. 100% целосность пакетов нам не нужна. 1ый клиент делает...

Как лучше читать из буфера void*?
hi проблема в следующем, не знаю как сделать лучше: есть буффер типа void*, нефикс размера... в...

Отправка и прием буфера SendBuf
Коллеги, всем привет! Обшарил весь инет, но нигде толкой инфы не нашёл по принципу работы и...

0
08.03.2015, 01:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2015, 01:02
Помогаю со студенческими работами здесь

Как реализовать прием писем
Добрый день. У меня такой вопрос. Имеются два почтовых ящика( 11@ch.ru и 22@ch.ru). Необходимо,...

Создание бесконечно большого буфера
Подскажите как создать временный буфер для целых чисел. Размер буфера заранее не известен и...

Передача большого буфера даных
Добрый день , столкнулся с такой проблемой, мне нужно передать на сервер буфер длинной допустим...

c# .NET 2.0 Как реализовать приём почты
Всем привет! Если не трудно приведите плиз простой пример email-клиента, который умеет принимать...


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

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