Передача большого буфера через сокет - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ниже приведены клиент и сервер(позаимствовал из соседней темы). Все работает, но при передаче буфера в 500000 байт сервер принимает каждый раз разное число байт. иногда все, иногда - 393216.491520, причем read завершается без ошибок, отправляются все байты. Как быть? Куда копать? PS:
#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;
}
#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);
        }
}

Решение задачи: «Передача большого буфера через сокет»

textual
Листинг программы
#include <sys/poll.h>
 
...
 
        struct pollfd p;
        p.fd = sockd;
        p.events = POLLIN;
        
        if (poll(&p, 1, 1) < 1)
            break;

Объяснение кода листинга программы

  1. Включаем заголовочный файл <sys/poll.h>.
  2. Создаем структуру pollfd p.
  3. Присваиваем полю fd значение sockd.
  4. Присваиваем полю events значение POLLIN.
  5. Вызываем функцию poll с аргументами p, 1 и 1.
  6. Если результат меньше 1, то выходим из цикла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы