Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 04.08.2018
Сообщений: 3

Получение данных через сокет

04.08.2018, 19:44. Показов 2069. Ответов 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
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
int main()
{
    int         result;
    int     sock_listen;
    int     sock;
    struct      sockaddr_in addr;
    char        buf_login[500];
    char        buf_password[500];
    int         bytes_read;
 
    sock_listen = socket(AF_INET, SOCK_STREAM, 0);
    if(sock_listen < 0)
    {
        perror("socket");
        exit(1);
    }
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8000);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
    result = bind(sock_listen, (struct sockaddr *)&addr, sizeof(addr));
    if(result < 0)
    {
        perror("bind");
        exit(2);
    }
 
    result = listen(sock_listen, 1);
    if(result < 0)
    {
        perror("listen");
        exit(3);
    }
    
    while(1)
    {
        sock = accept(sock_listen, NULL, NULL);
        if(sock < 0)
        {
            perror("accept");
            exit(4);
        }
        
        bytes_read = recv(sock, buf_login, 500, 0);
 
        printf(buf_login);
        printf("\n");
        
        close(sock);
    }
 
    return 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
int main()
{
    int sock;
    int result;
    struct sockaddr_in addr;
    char msg_1[] = "Alisa";
    char msg_2[] = "Bob";
 
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        perror("socket");
        exit(1);
    }
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8000);
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
 
    result = connect(sock, (struct sockaddr *)&addr, sizeof(addr));
    if (result < 0)
    {
        perror("connect");
        exit(2);
    }
 
    send(sock, msg_1, sizeof(msg_1), 0);
    send(sock, msg_2, sizeof(msg_2), 0);
 
    close(sock);
 
    return 0;
 
}
Т.е. клиент отправляет сообщение "Alisa", потом сообщение "Bob", сервер принимает оба сообщения (судя по объему принятых байтов), но в буфере лежит только текст "Alisa".
Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2018, 19:44
Ответы с готовыми решениями:

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

Отправка и получение данных через RS-485
Помогите кто чем сможет. Надо отправить 2 командных пакетов из 7-ми байтов. Пауза между командными пакетами не менее 3-х мс. Пауза между...

Передача матрицы через сокет
Добрый день всем участникам форума. Проблема состоит в следующем: клиент генерирует квадратную матрицу и передает через сокет серверу,...

4
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
04.08.2018, 21:35
Лучший ответ Сообщение было отмечено duffman080 как решение

Решение

Цитата Сообщение от duffman080 Посмотреть сообщение
но в буфере лежит только текст "Alisa"
В C и C++ строки являются массивами символов.
Для указания конца строки используется символ '\0'
То есть код
C++
1
2
char msg_1[] = "Alisa";
char msg_2[] = "Bob";
Равносилен
C++
1
2
char msg_1[] = { 'A', 'l', 'i', 's', 'a', '\0' };
char msg_2[] = { 'B', 'o', 'b', '\0' };
Вы видите только "Alisa", так как клиент так же передает символ конца строки и буфер содержит последовательность
C++
1
{ 'A', 'l', 'i', 's', 'a', '\0', 'B', 'o', 'b', '\0' }
1
0 / 0 / 0
Регистрация: 04.08.2018
Сообщений: 3
06.08.2018, 07:34  [ТС]
Да, действительно, проверил при посимвольном выводе кажого элемента массива, так и есть. Спасибо!
Но тогда у меня еще один вопрос: если я хочу вывести содержимое буфера в текстовый файл, то в текстовый файл также запишется только первое сообщение (строка "Alisa"). А как сделать, чтоб записалось всё содержимое буфера (чтоб данные "Bob" тоже записались в файл)? Только поэлементный вывод каждого символа массива в файл?
C++
1
2
3
4
5
6
7
std::ofstream out;
out.open("/home/user/file.txt");
out << buf_login[0];
out << buf_login[1];
out << buf_login[2];
...
out << buf_login[9];
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
06.08.2018, 20:31
Цитата Сообщение от duffman080 Посмотреть сообщение
А как сделать, чтоб записалось всё содержимое буфера
Возможно вам подойдет метод write
1
0 / 0 / 0
Регистрация: 04.08.2018
Сообщений: 3
06.08.2018, 20:48  [ТС]
Хорошо, понял. Большое спасибо за помощь!=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2018, 20:48
Помогаю со студенческими работами здесь

Передача файла через сокет
Всем привет! Создал клиент-сервер. Клиент должен передавать серверу определенные файлы, название которых (которого) ему передает сервер. ...

Передача структуры через сокет
Привет всем. Подскажите пожалуйста, где я мок на косячить. Потому что я уже бомбить начинаю... клиент#include &lt;sys/types.h&gt; ...

Скачивание файлов через сокет
Привет народ!))) Начал неделю назад изучать использование сокетов в С++, необходимо сделать программу, похожую на известную всем wget, то...

Передача hbitmap через сокет
У меня есть часть программы которая делает скриншот экрана в hbitmap и мне нужно отправить этот скриншот через сокет. Как мне этого...

Передача массива через сокет
Здравствуйте. Подскажите пожалуйста как можно передать большой массив(4К-64К) целочисленных значений с использованием winsockets. Есть ли...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru