【发布时间】:2020-01-07 17:03:33
【问题描述】:
我正在尝试创建允许客户端将文件上传到服务器的应用程序,现在我使用 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 会解决我的问题吗?
【问题讨论】:
-
已经有一个标准协议:TFTP
-
"现在我使用 UDP 套接字" - 你为什么选择 UDP 而不是 TCP?
-
如果您的目标只是传输文件(而不是学习如何使用 UDP 传输文件),那么使用 TCP 将比使用 UDP 少得多。