我正在尝试创建允许客户端将文件上传到服务器的应用程序,现在暂时使用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是否可以解决我的问题?
答案 0 :(得分:1)
UDP是不可靠的协议。如果数据包丢失,则需要让接收者通知发送方,以便它可以重新传输数据包。接收者还需要允许乱序接收数据包。
使用TCP将为您解决此问题,因为它具有内置的可靠性并且可以保证数据按顺序到达。
将此可靠性添加到UDP并非易事,但可以做到。无耻的插件:UFTP做到了这一点,并支持多播。
答案 1 :(得分:0)
我已经读过UDP只能处理大约64kB数据包,是真的吗?
是的。因此,您必须将较大的文件分解为较小的数据包,然后分别发送。并且要知道UDP是不可靠的-根本无法保证数据包的传送,也不能保证数据包的发送顺序是相同的-因此,您必须在传输协议中增加可靠性-为收到的数据包发回ACK,在每个数据包等中使用序列号,以便接收方知道哪些数据包按什么顺序排列,发送方可以知道接收方丢失了哪些数据包,因此可以重新发送。
切换到TCP是否可以解决我的问题?
是的,因为它具有内置的传递和完整性保证。尽管,UDP 也可以工作(Trivial FTP这样的协议就是证明)。