Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49

Передача большого буфера через сокет

20.10.2009, 23:46. Показов 1708. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ниже приведены клиент и сервер(позаимствовал из соседней темы).
Все работает, но при передаче буфера в 500000 байт сервер принимает каждый раз разное число байт.
иногда все, иногда - 393216.491520, причем read завершается без ошибок, отправляются все байты.

Как быть? Куда копать?

PS:
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
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc,char ** argv )
{
        int sockfd;
        int len,len2=0;
        struct sockaddr_in address;
        int result;
        char lenbuf[256], *buf;
    
        sockfd = socket (AF_INET, SOCK_STREAM, 0); 
    
        address.sin_family = AF_INET;
        address.sin_addr.s_addr= inet_addr("127.0.0.1");
        address.sin_port = htons(9734);
        len = sizeof(address);
    
        result = connect(sockfd, (struct sockaddr *) &address, len);
    
        if(result==-1)
        {
                printf("don't connect\n");
                perror("ppos: client");
                exit(1);
        }
 
        char *d; 
        d = malloc(500000);
        FILE *fd;
        fd = fopen("/tmp/data", "r");
        int n = fread(d,1,500000,fd);
 
        write(sockfd, d, n); 
        read(sockfd, d, 10);
        printf("%d\n",n);
        close(sockfd);
        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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
 
int main()
{
        int err=-1;
        int server_sockfd, client_sockfd;
        int server_len, client_len;
        struct sockaddr_in server_address;
        struct sockaddr_in client_address;
    
        server_sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    
        server_address.sin_family = AF_INET;
        server_address.sin_addr.s_addr = htonl(INADDR_ANY);
        server_address.sin_port = htons(9734);
        server_len = sizeof(server_address);
        err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));
    
        if(err!=0) printf("bind error!\n");
        else printf("bind is ok\n");
        err=-1;
    
        err=(listen(server_sockfd, 5));
        if(err!=0) printf("listen error!\n");
        else printf("listen is ok\n");
        char *d = malloc(500000);
        while(1)
        {
    
                printf("server waiting\n");
                client_len = sizeof(client_address);
                client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
    
                int n,s=0;
                n = 0;
                while((n = read(client_sockfd, d, 500000)) > 0){ 
                        s += n;
                        write(client_sockfd, d, 10);
                }
                if(n < 0){ 
                        printf("%s",strerror(errno));
                }
                printf(" %d\n",s);
                memset(d,0,500000);
                close(client_sockfd);
        }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.10.2009, 23:46
Ответы с готовыми решениями:

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

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

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

9
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.10.2009, 04:31
а что в /tmp/data ?

Добавлено через 46 секунд
C
1
write(sockfd, d, n);
что возвращает ?
0
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
21.10.2009, 08:00  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
а что в /tmp/data ?

Добавлено через 46 секунд
C
1
write(sockfd, d, n);
что возвращает ?
В /tmp/data текстовый файл. размером 1490000 байт.
write возвращает 500000, всегда.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.10.2009, 08:36
проверил на двух мегабайтах, всегда 500000 пишут
1
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
21.10.2009, 20:13  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
проверил на двух мегабайтах, всегда 500000 пишут
да, проверил на другой машине, почти всегда все доходит, но если клиентов массово запускать и в параллель, то все равно потери появлятются, ну да ладно.

У меня теперь другой вопрос .

Можно ли как-нибудь послать "конец файла", не закрывая соединение?
Чтобы цикл while с read() прервать.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.10.2009, 05:16
C
1
    while ((n = read()) > 0)
0
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
22.10.2009, 20:52  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
C
1
    while ((n = read()) > 0)
Спасибо, но не то. Эта конструкцию завершиться только если клиент закроет сокет.
Можно использовать неблокирующий соклет или select/poll
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.10.2009, 03:55
C
1
2
3
4
5
6
7
8
9
10
#include <sys/poll.h>
 
...
 
        struct pollfd p;
        p.fd = sockd;
        p.events = POLLIN;
        
        if (poll(&p, 1, 1) < 1)
            break;
потестил (в цикле у сервера), пока данные идут, возвращает еденицу, когда прекратились, возвращает ноль, а клиент остаётся на связи
1
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
23.10.2009, 17:36  [ТС]
Я уже разобрался, спасибо
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.10.2009, 04:00
да я понял, просто чтобы до конца тему раскрыть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.10.2009, 04:00
Помогаю со студенческими работами здесь

Передача файла через сокет
Проблема в том что файл восстанавливаемый на клиенте открывается хорошо. На сервере же массив байтов востанавливается, но файл не...

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

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

Передача файла через сокет
Итак... у меня сложилась одна затруднительная ситуация. Есть сервер, есть клиент. С передает К файл посредством client.SendFile(filename,...

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru