gpt4 book ai didi

c - 通过 UDP 发送大文件

转载 作者:行者123 更新时间:2023-11-30 20:17:25 24 4
gpt4 key购买 nike

我正在尝试创建允许客户端将文件上传到服务器的应用程序,目前我使用 UDP 套接字。

我通过 UDP 发送数据,它适用于小尺寸文件,当我尝试发送 1 MB 左右时,它不会发送完整数据。

我听说 UDP 只能处理大约 64kB 的数据包,这是真的吗?我能以某种方式处理它并解决我的问题吗?

我的发送文件的代码:

        sendto(fdsocket, sizeBuff, sizeof(sizeBuff), 0, (struct sockaddr*)&serverAddress, addrlen); // send file size
while(1) {
//Read file in chunks of 1024 bytes
int nread = fread(buff, 1, BUFF_SIZE, filefp);

printf("Bytes read %d \n", nread);


// If read was success, send data

if(nread > 0){
printf("Sending file ...\n");

int n = sendto(fdsocket, buff, strlen(buff), 0, (struct sockaddr *) &serverAddress, addrlen);

以及我用于接收文件的代码:

        recvfrom(fdsocket, sizeBuff, sizeof(sizeBuff), 0, (struct sockaddr *)&serverAddress, &addrlen); // recv file size
filesize = sizeBuff[0];
printf("Filesize: %lu", filesize);

//recvfrom(fdsocket, buff, BUFF_SIZE, 0, (struct sockaddr *)&serverAddress, &addrlen);

if(sizeBuff[0] > 0){
while(sumBytes<filesize){
/* Receive data in chunks of 1024 bytes */
bytesReceived = recvfrom(fdsocket, buff, sizeof(buff), 0, (struct sockaddr*)&serverAddress, &addrlen);
if(bytesReceived < 0) {
printf("Recvfrom: Error in receiving the file\n");
exit(1);
} else {
sumBytes = sumBytes + bytesReceived;
printf("Bytes received: %d\n", sumBytes);
}
if(fwrite(buff, 1, bytesReceived, fp)<0){
printf("ERROR writing file");
exit(1);
}

我希望它能够处理大文件,例如 100MB,并且还允许我发送 jpg、xls 等。

我怎样才能做到这一点?切换到 TCP 可以解决我的问题吗?

最佳答案

I've read that UDP can only handle about 64kB packet, is it true?

是的。因此,您必须将较大的文件分成较小的数据包并单独发送。并且要知道 UDP 是不可靠的 - 根本无法保证数据包传送,并且不能保证数据包按照发送的顺序到达 - 因此您必须在传输协议(protocol)中添加可靠性 - 为收到的数据包发回 ACK,在每个数据包中使用序列号等,以便接收方知道哪些数据包按什么顺序发送,并且发送方可以知道接收方丢失了哪些数据包,以便可以重新发送它们。

Will switching to TCP solve my problem?

是的,因为它内置了交付和完整性保证。不过,UDP也可以工作(像Trivial FTP这样的协议(protocol)就是证明)。

关于c - 通过 UDP 发送大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57794550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com