0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 17
1

Передача и получение клиент-сервер

09.05.2016, 11:09. Показов 2536. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня программа- консольное приложение с архитектурой клиент-сервер. Также сервер подключен к базе данных MySQL, что, думаю, не столь важно. Осуществляется прием-передача данных между клиентом и серверов, т.е. есть различные функции добавления записей,удаление,редактирование, поиск, вывод записей на экран. Все действия осуществляет сервер, т.е. клиент передает или же объект, или чаровскую переменную серверу, и потом в зависимости от функций получает обратно результат.
И у меня возникла проблема: при использовании всех функций по отдельности, сразу же при при запуске, все работает прекрасно, но потом если, например, после удаления выбрать вывод записей, выводит ерунду полную. Фишка в том, что кажется, что иногда сервер не успевает отправлять записи, т.е клиент вместо того,чтобы получать объект как будто не дожидается и выводит его, какой он есть, т.е пустой. Ну или наоборот, как будто тормозит клиент.
Пробовала в некоторых местах в сервере поставить Sleep, помогает, но проследить везде и во всех вариантах,где будет такая ерунда нереально,слишком объемная программа. Не очень разбираюсь в клиент-серверных приложениях,честно говоря,совсем не очень, может есть какие-то варианты,чтобы клиент дожидался сервера и наоборот.
Соединение TCP многопоточное:
Сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void main(){
        WORD wVersionRequested;
    WSADATA wsaData;
    int err, num_client = 0;
    wVersionRequested=MAKEWORD(2,2);
    err=WSAStartup(wVersionRequested,&wsaData);
    if (err!=0)
        return;
    SOCKET s=socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_port=htons(1280);
    local_addr.sin_addr.s_addr=0;
    bind(s,(sockaddr *) &local_addr,sizeof(local_addr));
    int c=listen(s,5);
    cout<<"Соединение установлено."<<endl;
    cout<<endl;
    SOCKET client_socket;
    sockaddr_in client_addr;
    int client_addr_size=sizeof(client_addr);
    int i;
    while((client_socket=accept(s,(sockaddr *)&client_addr,&client_addr_size))){
        num_client++;
        print(num_client);
        DWORD thID;
        CreateThread(NULL,NULL,ThreadFunc,&client_socket,NULL,&thID);
    }
DWORD WINAPI ThreadFunc(LPVOID client_socket)
{
    
    SOCKET s2=((SOCKET *) client_socket)[0];
    //объявление переменных
    while (recv(s2,number_case,sizeof(number_case),0)){
        num_case = number_case[0];
        switch(num_case) {
            case '1':
//...
и клиент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void main() {
    
    WORD wVersionRequested;
    WSADATA wsaData;
    //объявление переменных
    wVersionRequested=MAKEWORD(2,2);
    error = WSAStartup(wVersionRequested,&wsaData);
    if (error != 0)
        return;
    while(true){
        SOCKET s = socket(AF_INET,SOCK_STREAM,0);
        sockaddr_in dest_addr;
        dest_addr.sin_family = AF_INET;
        dest_addr.sin_port = htons(1280);
        dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
        connect(s,(sockaddr *)&dest_addr,sizeof(dest_addr));
        while(choice){
            system("cls");
            menu();
            choice = obj_vvod.vvod_num(1,6);
            _itoa(choice,res,10);
            Res=new char[strlen(res)+1];
            strcpy(Res,res);
            Res[strlen(res)]='\0';
            send(s,Res,sizeof(Res),0);
            switch(choice){
            case 1:
//...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2016, 11:09
Ответы с готовыми решениями:

Передача данных клиент-сервер
Добрый день, пытаюсь разобраться с передачей данных клиент-сервер. Вот кое-как по примерам в...

Клиент-Сервер: передача байтов
Здравствуйте! Написала приложения клиента и сервера. Может, кто подскажет, как сделать буфер...

Передача файлов клиент-сервер
Здравствуйте. Мне нужно организовать передачу файла из одной папки в другую. Клиент отправляет,а...

Передача данных Клиент-сервер-клиенты
Как передавать не строчные значения, а к примеру координаты float, целочисленные и логику? //...

3
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
09.05.2016, 13:04 2
Лучший ответ Сообщение было отмечено 1234qwe как решение

Решение

1234qwe, функция recv за один вызов может вернуть не все что послалось за один вызов send а лишь часть этого (например первые N байт - последующий вызов(ы) будут возвращать "продолжение") - думаю все недоразумения из-за этого. Либо учитывайте это либо используйте UDP - там все что послано приходит одним пакетом но есть ограничение на размер
1
0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 17
09.05.2016, 13:48  [ТС] 3
да, вы абсолютно правы, не все возвращает, спасибо вам огромнейшее, очень помогли

Добавлено через 28 минут
а может быть еще подскажете,есть какие-то стандартные идеи,как это сделать, если не использовать UDP?
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
09.05.2016, 17:07 4
Ваш протокол должен позволять выделить из последовательности байт отдельные пакеты - например через разделение пакетов особой последовательностью или передавайте в начале пакета его размер
0
09.05.2016, 17:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2016, 17:07
Помогаю со студенческими работами здесь

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

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

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

Клиент сервер
Здравствуйте, задали в институте написать клиент серверное приложение на си через сокеты. Может у...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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