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

Взаимодействие клиента и сервера

10.09.2015, 17:35. Показов 7815. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает два слова серверу, сервер их сравнивает и возвращает «истина», если они одинаковы по количеству и порядку следования в них букв, и «ложь»– при невыполнении хотя бы одного из этих условий.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.09.2015, 17:35
Ответы с готовыми решениями:

Взаимодействие клиента и сервера на основе протокола TCP/IP
Не получается переделать. совсем не понимаю как работает. но сначала. препод ничего не объяснил, поэтому уточняю 1. Как создать проект...

Осуществить взаимодействие клиента и сервера на основе протокола UDP
Есть код Серверная часть #include <iostream> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") using namespace std; ...

Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP
Здравствуйте! Задание такое: Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и...

11
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
11.09.2015, 19:27
Лучший ответ Сообщение было отмечено Alya96 как решение

Решение

Вот накидал, но только для винды.

Сервер
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <winsock2.h>
#include <string.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#define  S_BUFSIZE   128
SOCKET create_socket(u_short port, int backlog, WSAEVENT* pevent, int& err);
void   remove_user(DWORD index);
void   remove_all(void);
 
static SOCKET   socks[WSA_MAXIMUM_WAIT_EVENTS];
static WSAEVENT events[WSA_MAXIMUM_WAIT_EVENTS];
static DWORD    scnt = 0;
 
//подключение новых клиентов максимум до WSA_MAXIMUM_WAIT_EVENTS
void onAccept(void){
    if(scnt >= WSA_MAXIMUM_WAIT_EVENTS)
        return;
    
    sockaddr_in addr = {0};
    int len = sizeof(addr);
 
    socks[scnt] = accept(socks[0], (sockaddr*)&addr, &len);
    if(socks[scnt] != INVALID_SOCKET){
        events[scnt] = WSACreateEvent();
        if(events[scnt] == WSA_INVALID_EVENT){
            closesocket(socks[scnt]);
            return;
        }
        int ret = WSAEventSelect(socks[scnt], events[scnt], FD_READ | FD_CLOSE);
        if(ret != SOCKET_ERROR){
            printf("\t\1 new user - %d\n", scnt);
            ++scnt;
        } else {
            WSACloseEvent(events[scnt]);
            closesocket(socks[scnt]);
        }
    }
}
 
//чтение присланых данных
void onRead(DWORD index){
    char buf[S_BUFSIZE];
    int  ret = recv(socks[index], buf, sizeof(buf) - 1, 0);
    if(! ret || ((ret == SOCKET_ERROR) && (WSAGetLastError() != WSAEWOULDBLOCK)))
        remove_user(index);
    else if(ret > 0){
        buf[ret] = '\0';
        printf("get data: %s\n", buf);
 
        char* w1 = strtok(buf,  " \r\n\t");
        char* w2 = strtok(NULL, " \r\n\t");
        if((w1 != NULL) && (w2 != NULL)){
            if(! lstrcmpA(w1, w2))
                lstrcpyA(buf, "True");
            else
                lstrcpyA(buf, "False");
        } else
            lstrcpyA(buf, "False");
 
        //ответить
        send(socks[index], buf, lstrlenA(buf), 0);
    }
}
 
 
int main(void){
    u_short port = 17777;
    WSADATA wd;
    if(WSAStartup(0x0202, &wd) != 0){
        fprintf(stderr, "code error: %d\n", WSAGetLastError());
        return 1;
    }
 
    int err;
    socks[0] = create_socket(port, 4, &events[0], err);
    if(socks[0] == INVALID_SOCKET){
        fprintf(stderr, "code error: %d\n", err);
        return 1;
    }
    puts("run server...");
 
    BOOL  done = FALSE;
    DWORD inx;
    WSANETWORKEVENTS net;
 
    for(scnt = 1; ! done; ){ // для примера бесконечный цикл
        inx = WSAWaitForMultipleEvents(scnt, events, FALSE, 110, FALSE);
        switch(inx){
        case WSA_WAIT_FAILED:
            done = TRUE;
            break;
        case WSA_WAIT_TIMEOUT:
            break;
        default:
            inx -= WSA_WAIT_EVENT_0;
            if(inx >= scnt)
                continue;
 
            if(WSAEnumNetworkEvents(socks[inx], events[inx], &net) == SOCKET_ERROR){
                if(! inx)
                    done = TRUE;
                else
                    remove_user(inx);
                continue;
            }
 
            if(net.lNetworkEvents & FD_ACCEPT){
                if(net.iErrorCode[FD_ACCEPT_BIT] != 0){
                    done = TRUE;
                    continue;
                }
                ::onAccept();
            }
            if(net.lNetworkEvents & FD_READ){
                if(net.iErrorCode[FD_READ_BIT] != 0){
                    remove_user(inx);
                    continue;
                }
                ::onRead(inx);
            }
            if(net.lNetworkEvents & FD_CLOSE){
                if(net.iErrorCode[FD_CLOSE_BIT] != 0){
                    remove_user(inx);
                    continue;
                }
                remove_user(inx);
            }
            break;
        }
        /*для выхода Esc
        if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
            break;*/
    }
    remove_all();
    return WSACleanup();
}
 
//создание серверного сокета
SOCKET create_socket(u_short port, int backlog, WSAEVENT* pevent, int& err){
    WSAEVENT hevent = WSA_INVALID_EVENT;
    SOCKET     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if(sock == INVALID_SOCKET){
        err = WSAGetLastError();
        return INVALID_SOCKET;
    }
    sockaddr_in addr = {0};
    addr.sin_family       = AF_INET;
    addr.sin_port         = htons(port);
    addr.sin_addr.s_addr  = htonl(INADDR_ANY);
 
    err = NO_ERROR;
    if(bind(sock, (const sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
        goto error;
    if((hevent = WSACreateEvent()) == WSA_INVALID_EVENT)
        goto error;
    if(WSAEventSelect(sock, hevent, FD_ACCEPT) == SOCKET_ERROR)
        goto error;
    if(listen(sock, backlog) == SOCKET_ERROR)
        goto error;
    
    *pevent = hevent;
    return sock;
error:
    err = WSAGetLastError();
    closesocket(sock);
 
    if(hevent != WSA_INVALID_EVENT)
        WSACloseEvent(hevent);
    return INVALID_SOCKET;
 
}
 
//удаление одного
void remove_user(DWORD index){
    if(index <= scnt){
        WSAEventSelect(socks[index], events[index], 0L);
        WSACloseEvent(events[index]);   
        closesocket(socks[index]);
        --scnt;
        for(DWORD i = index; i < scnt; ++i){
            socks[i]  = socks[i + 1];
            events[i] = events[i + 1];
        }
        printf("\t\1 disconnect user - %d\n", scnt);
    }
}
 
//удаление всех
void remove_all(void){
    for(DWORD i = 0; i < scnt; ++i){
        WSASetEvent(events[i]);
        WSAEventSelect(socks[i], events[i], 0L);
        WSACloseEvent(events[i]);
        closesocket(socks[i]);
    }
    scnt = 0;
}

Клиент
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#define  S_BUFSIZE  128
SOCKET create_socket(const char* host_ip, u_short port, int& err);
static int sock_read(SOCKET sock, char* buf, int len, long msec = 7L);
static int sock_write(SOCKET sock, const char* buf, int len);
static int console_read(FILE* _in, char* buf, int len);
 
int main(void) {
    u_short port   = 17777;
    char    host[] = "localhost";
    WSADATA wd;
    if(WSAStartup(0x0202, &wd) != 0){
        fprintf(stderr, "code error: %d\n", WSAGetLastError());
        return 1;
    }
    int  err;
    SOCKET sock = create_socket(host, port, err);
    if(sock == INVALID_SOCKET){
        fprintf(stderr, "error code: %d\n", err);
        return 1;
    }
    
    char buf[S_BUFSIZE];
    int  len;
    while(1){
        printf("Enter 2-word: ");
        if((len = console_read(stdin, buf, sizeof(buf) - 1)) == 0)
            continue;
        if(! lstrcmpA(buf, "exit"))
            break;
 
        if(sock_write(sock, buf, len) == SOCKET_ERROR){
            fputs("error write", stderr);
            break;
        }
        if(sock_read(sock, buf, sizeof(buf) - 1) > 0)
            printf("answer: %s\n\n", buf);
    }
    closesocket(sock);
    return WSACleanup();
}
 
//создание сокета
SOCKET create_socket(const char* host_ip, u_short port, int& err){
    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock == INVALID_SOCKET){
        err = WSAGetLastError();
        return INVALID_SOCKET;
    }
 
    u_long arg = 1;
    if(ioctlsocket(sock, FIONREAD, &arg) == SOCKET_ERROR) {
        err = WSAGetLastError();
        closesocket(sock);
        return INVALID_SOCKET;
    }
    sockaddr_in addr = {0};
    addr.sin_family      = AF_INET;
    addr.sin_port        = htons(port);
    addr.sin_addr.s_addr = inet_addr(host_ip);
 
    if(addr.sin_addr.s_addr == INADDR_NONE) {
        hostent* host = gethostbyname(host_ip);
        if(host == NULL) {
            err = WSAGetLastError();
            closesocket(sock);
            return INVALID_SOCKET;
        }
        memcpy(&addr.sin_addr, host->h_addr_list[0], host->h_length);
    }
    if(connect(sock, (const sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
        err = WSAGetLastError();
        closesocket(sock);
        sock = INVALID_SOCKET;
    }
    return sock;
}
 
//чтение
static int sock_read(SOCKET sock, char* buf, int len, long msec){
    FD_SET  fd;
    timeval tval;
    tval.tv_sec  = msec;
    tval.tv_usec = 0L;
 
    FD_ZERO(&fd);
    FD_SET(sock, &fd);
    int ret = select(0, &fd, NULL, NULL, &tval);
    if(! ret || (ret == SOCKET_ERROR))
        return ret;
    if(FD_ISSET(sock, &fd)){
        if((ret = recv(sock, buf, len, 0)) > 0)
            buf[ret] = '\0';
        else
            ret = 0;
    }
    return ret;
}
 
//запись
static int sock_write(SOCKET sock, const char* buf, int len){
    int ret, i = 0;
    while(i < len){
        ret = send(sock, buf + i, len - i, 0);
        if(ret == SOCKET_ERROR){
            if(WSAGetLastError() != WSAEWOULDBLOCK)
                return ret;
            ret = 0;
            Sleep(1);
        } else if(! ret)
            break;
        i += ret;
    }
    return i;
}
 
//чтение с консоли
static int console_read(FILE* _in, char* buf, int len){
    int c, i = 0;
    while(((c = fgetc(_in)) != EOF) && (i < len)){
        if(c == '\r' || c == '\n')
            break;
        *buf++ = c;
        ++i;
    }
    *buf = '\0';
    if(i > 0)
        fflush(_in);
    return i;
}
4
3 / 3 / 0
Регистрация: 08.03.2015
Сообщений: 18
14.09.2015, 23:15
http://citforum.ru/book/cook/winsock.shtml ПОЧИТАЙ, ну а сравнить два слова думаю Вы и сами в состоянии, если нет,то можно не читать)))
0
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 14
24.09.2015, 22:18  [ТС]
А не подскажите, как сделать проверку, чтобы вводились только буквы и чтобы вводилось ограниченное количество символов.
0
3 / 3 / 0
Регистрация: 08.03.2015
Сообщений: 18
26.09.2015, 07:33
Только буквы я бы сделал через значение таблицы ascii, а ограниченное кол-во, ну сделай проверку, если передаваемое кол-во символов больше или меньше требуемой длины-не передавать и выводить что-нить вроде "сообщение слишком длинное"
0
 Аватар для botemm
1 / 1 / 0
Регистрация: 17.07.2014
Сообщений: 40
09.10.2015, 18:53
А возможно, сделать так, чтоб ПК или ноутбук был сервером, и принимал строки или лучше числа, а программка, на пример php отправляла их? Как это сделать если возможно.
0
Заблокирован
10.10.2015, 11:54
botemm, размещаете скрипт на веб сервере, и из программы вызываете его post или get запросом скажем... но то что пишете вы) что бы и ноут был сервером и получал ответ от сервера(php предполагает наличие веб сервера) попахивает бредом)
0
 Аватар для botemm
1 / 1 / 0
Регистрация: 17.07.2014
Сообщений: 40
12.10.2015, 08:27
Уже сделал. Работает.

Добавлено через 2 минуты
У меня бесплатный хостинг.
У меня там сайт.

Добавлено через 9 минут
с поддержкой php.
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 22
03.11.2015, 15:13
Данное приложение может работать через интернет на разных компьютерах?
0
 Аватар для botemm
1 / 1 / 0
Регистрация: 17.07.2014
Сообщений: 40
03.11.2015, 15:54
Да. Программы что принимает данные и посылают, работают на разных компьютерах связываясь через скрипт на хостинге в инете. На самом деле программа сервер просто проверяет содержимое файла на хостинге, а клиент, записывает туда данные. Если нужно могу скинуть все исходники. Клиент сделан как приложение виндовс, и есть экземпляр как страница интернета.
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 22
03.11.2015, 16:22
Если не трудно
0
 Аватар для Shvonder
46 / 35 / 24
Регистрация: 16.03.2015
Сообщений: 179
03.11.2015, 17:00
Геомеханик, Молодец!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.11.2015, 17:00
Помогаю со студенческими работами здесь

Осуществить взаимодействие клиента и сервера на основе протокола UDP
6. Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом:...

Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP
Есть задача: Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать...

Взаимодействие клиента под Win и сервера под Unix
Подскажите, пожалуйста... Есть приложение клиент-сервер. Клиент -программа под Windows. Сервер -под Unix(Sun Solaris). Как...

Отключение клиента от сервера. сокеты
Здравствуйте, пишу простой чат с использованием сокетов. Чат работает вполне адекватно, но есть проблема, после отключения клиента от...

Написание клиента/сервера для обмена сообщениями и файлами
Всем привет. Возникла задача: Написать клиент/сервер, для обмена сообщениями и файлами. Клиентов будет около 100-200, клиенты должны...


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

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

Новые блоги и статьи
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
Настройка MTProxy
Loafer 11.06.2025
Дополнительная информация к инструкции по настройке MTProxy: Перед сборкой проекта необходимо добавить флаг -fcommon в конец переменной CFLAGS в Makefile. Через crontab -e добавить задачу: 0 3. . .
Изучаем Docker: что это, как использовать и как это работает
Mr. Docker 10.06.2025
Суть Docker проста - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер, если говорить образно, это запечатанная коробка, в которой находится ваше приложение вместе. . .
Тип Record в C#
stackOverflow 10.06.2025
Многие годы я разрабатывал приложения на C#, используя классы для всего подряд - и мне это казалось естественным. Но со временем, особенно в крупных проектах, я стал замечать, что простые классы. . .
Разработка плагина для Minecraft
Javaican 09.06.2025
За годы существования Minecraft сформировалась сложная экосистема серверов. Оригинальный (ванильный) сервер не поддерживает плагины, поэтому сообщество разработало множество альтернатив. CraftBukkit. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru