Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过TCP传输recv()服务器/客户端C文件来传输最后一个数据包_C_Winapi_Tcp_Recv_Transmitfile - Fatal编程技术网

无法通过TCP传输recv()服务器/客户端C文件来传输最后一个数据包

无法通过TCP传输recv()服务器/客户端C文件来传输最后一个数据包,c,winapi,tcp,recv,transmitfile,C,Winapi,Tcp,Recv,Transmitfile,我一直在尝试通过windows客户端上的TCP\IP将文件传输到Linux服务器。 在过去的几天里,这一直是一个主要问题,因为不理解为什么服务器端没有收到最后一个数据包,这会阻止文件的写入 我想实现的是下载图像(JPG、PNG)、程序(EXE)等 输出 客户 lltoa(尺寸:四分之一,容器,10); //发送文件大小 发送(sock,container,sizeof(container),0); b0(容器,1024); //文件结束大小 无符号uu int64 uiPos=0; 无符号uu

我一直在尝试通过windows客户端上的TCP\IP将文件传输到Linux服务器。 在过去的几天里,这一直是一个主要问题,因为不理解为什么服务器端没有收到最后一个数据包,这会阻止文件的写入

我想实现的是下载图像(JPG、PNG)、程序(EXE)等

输出

客户
lltoa(尺寸:四分之一,容器,10);
//发送文件大小
发送(sock,container,sizeof(container),0);
b0(容器,1024);
//文件结束大小
无符号uu int64 uiPos=0;
无符号uuu int64 uiRemaining=ul.QuadPart;
而(剩余>0)
{
ul.QuadPart=uiPos;
ov.偏移=ul.低部分;
ov.OffsetHigh=ul.HighPart;

DWORD dwNumToSend=(根据您显示的代码,发现了一些问题。按以下方式编辑后,它对我有效。您可以试一试。(如果仍然存在问题,请显示
ul.QuadPart
ul.LowPart
ul.HighPart
相关代码。)

在客户端:


Change
DWORD dwNumToSend=(当recv返回-1时,请提供来自errno的错误代码,您可以打印errno或使用perror。这只是意味着没有更多的数据可从套接字接收…这就是recv()的原因)返回-1..@RALISENDABUT recv可以返回更多类型的错误,特定的详细信息可能有助于调试您的问题。@Pch12\u我会检查一下。我会在几分钟后发布错误:资源暂时不可用。这就是它打印的@RALISENDA
            lltoa(size.QuadPart,container,10);
            //Send file size
            send(sock, container, sizeof(container), 0);
            bzero(container,1024);
            //End of file size
            unsigned __int64 uiPos = 0;
            unsigned __int64 uiRemaining = ul.QuadPart;
            while (uiRemaining > 0)
            {
                ul.QuadPart = uiPos;
                ov.Offset = ul.LowPart;
                ov.OffsetHigh = ul.HighPart;
                DWORD dwNumToSend = (uiRemaining <= 3) ? 1 :1024; //(DWORD)uiRemaining;
                if (!TransmitFile(sock,get_file, dwNumToSend, 0, &ov, NULL, 0))
                {
                    if ((GetLastError() != ERROR_IO_PENDING) && (WSAGetLastError() != WSA_IO_PENDING))
                    break;
                    WaitForSingleObject(ov.hEvent, INFINITE);
                }
                uiPos += dwNumToSend;
                uiRemaining -= dwNumToSend;
                //Sleep(1);
            }
            CloseHandle(ov.hEvent);
            CloseHandle(get_file);  
            file_size = atoi(response);
            printf("File size: %lli \n",file_size);
            bzero(response,18384);
            //End of file size
            
            //First packet of file
            
            len = recv(client_socket,response,sizeof(response)<file_size?(sizeof(response)):file_size,MSG_WAITALL);
            printf("Received: %i \n",len);
            if (len == 0)
            {
                printf("Error downloading file!");
                goto jump;
            }

            file_size = file_size - len;
            int counter = 0;
            while(file_size > 0)
            {
            //Start getting the file
                fwrite(response,1,len,new_file);
                bzero(response,18384);
                len = recv(client_socket,response,((file_size <= 1024) || (len < 1024))?file_size:sizeof(response),MSG_WAITALL);
                printf("Received: %i\t|",len);
                if(len <= 0)
                {
                    break;
                }
                //Check if this is the last packet
                
                file_size = file_size - len;
                printf("Response #%i\tbytes_received: %i\tbytes remain:%li \n",counter,len,file_size);
                counter += 1;
            }
            if(file_size > 0)
            {
                printf("\t\t\tError downloading file!  bytes left:%li \n",file_size);
                
            }
            else
            {
                printf("Successfully downloaded file! \n");
            }
            fclose(new_file);
            goto jump;