Làm thế nào để nâng cấp bộ nhớ của file để gửi?

Code server

static int num = 0;
FILE *outfile;

void handle_client(int c)
{
    //char buf[1048576];
    char buf[1048576];
    char *lastpos;
    int size;
    outfile = fopen ("win.iso", "wb");

    while (1) {
	//printf("waiting data ...");
        size = recv(c, buf, 1048576, MSG_WAITALL);//MSG_NOSIGNAL);
        if (size == 0) {
            break;
        }
	//printf("%d Recv:%d %c %s\n",++num,size,buf[1048575],buf );
        //lastpos = strchr(buf, '\n');
        //send(c, buf, lastpos+1-buf, 0);
	fwrite(buf, size, 1, outfile);
	//break;
    }
	fclose(outfile);
}

int main()
{
    int s, c;
    int reuseaddr = 1;
    struct sockaddr_in6 addr;
    int pid;

    s = socket(AF_INET6, SOCK_STREAM, 0);
    setsockopt(s, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &reuseaddr, sizeof(reuseaddr));

    addr.sin6_family = AF_INET6;
    addr.sin6_port = htons(5000);
    addr.sin6_addr = in6addr_any;

    bind(s, (struct sockaddr *)&addr, sizeof(addr));
    listen(s, 5);

    while (1) {
	printf("listening client ...\n");
        c = accept(s, NULL, NULL);
	printf("accept a connection\n");
        /*
        pid = fork();
        if (pid == -1) {
            exit(1);
        } else if (pid == 0) {
            close(s);
            handle_client(c);
            close(c);
            return 0;
        } else {
            close(c);
            waitpid(pid, NULL, 0);
        }*/
        handle_client(c);
        //close(c);
    }
}

Code client

FILE* file_;
char buffer[1024];

/*
void readfile()
{
    file_ = fopen("client.c", "rb");
    while (!feof(file_)) // to read file
    {
        // fucntion used to read the contents of file
        fread(buffer, sizeof(buffer), 1, file_);
        printf("%s\n",buffer);
    }
}
*/

void ping(int s, char *message)
{
    char buf[1024];

    strncpy(buf, message, sizeof(buf));
    send(s, buf, strlen(buf), 0);
    //recv(s, buf, 8192, 0);
    //strtok(buf, "\n");
    //puts(buf);
}

int main()
{
    int s,num=0;
    struct sockaddr_in6 addr;

    s = socket(AF_INET6, SOCK_STREAM, 0);
    addr.sin6_family = AF_INET6;
    addr.sin6_port = htons(5000);
    inet_pton(AF_INET6, "::1", &addr.sin6_addr);
    connect(s, (struct sockaddr *)&addr, sizeof(addr));

    while(1){
    	//ping(s, "xinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchaoxinchao");


		file_ = fopen("/home/dungnt/Win10_x64.iso", "rb");
		//file_ = fopen("client.c", "rb");
		    while (!feof(file_)) // to read file
		    {
			// fucntion used to read the contents of file
			fread(buffer, sizeof(buffer), 1, file_);
			//printf("%s\n",buffer);
			num++;
			ping(s,buffer);
			sleep(0.1);
			//printf("%d\n",num);
		    }
		fclose(file_);

		break;
	}
    printf("%d\n",num);
    close(s);
    return 0;
}

Không thể tạo cái mảng bự chảng để lưu toàn bộ data của file và cũng không thể send 1 phát cái mảng bự chảng đó qua socket chỉ bằng 1 lần.

Hãy đọc từng đoạn của file rồi send qua socket.
Thường tôi hay đọc và gửi từng đoạn 32KB.

6 Likes

Chia nhỏ kiểu gì ak

Code này đọc lại thì cũng thấy bình thường, cũng đã chia file thành từng đoạn 1024 byte để gửi đi rồi.
Bên server cũng nhận liên tục rồi chỉ phải cái buff bên server nó lớn và lãng phí. Tầm vài chục KB đổ lại là OK.
Vấn đề bạn muốn mở rộng là mở rộng cái gì ?

4 Likes

t muốn mở rộng file gửi tầm 10G thì làm thế nào

Hiện tại bạn đang gặp vấn đề gì với file bao nhiêu G ?

1 Like

Các a có thể cho em keyword của mấy cái kiến thức này được không ạ? Cái này mới đối em, ko biết tìm trên google bằng từ gì.

Từ khóa nhé : FILE, socket, tcpip,

2 Likes

Mình muốn gửi file 10G tầm 10G qua mạng LAN và dùng hệ điều hành linux. NHưng vấn đề của mình là chia nhỏ file 10G thành những file nhỏ hơn để gửi vì ko thể gửi 10G cùng một lúc.

Thì tất nhiên là không thể gửi file 10G chỉ bằng 1 lệnh send/recv được.
Trên code kia người ta đã chia file đó thành rất nhiều đoạn dữ liệu 1024 byte và lần lượt gửi chúng đi rồi ?
Cứ gửi vậy đến khi nào hết thôi thì 1MB hay bao nhiêu GB nó cũng thế chỉ khác nhau thời gian hoàn thành.

3 Likes

có cách nào cải thiện tốc độ gửi không ak

  • Tăng kích thước bộ đệm từ 1KB lên 32KB chẳng hạn. Và bỏ hết delay trong các chương trình truyền nhận dữ liệu (hàm sleep).

  • Tăng băng thông mạng.

  • Tăng băng thông ổ đĩa (trường hợp dùng HDD).

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?