文件发送卡在中间[套接字编程]

时间:2016-03-16 10:13:14

标签: java c sockets network-programming file-transfer

以下是我用来将文件发送到连接的代码段。我面临的奇怪之处在于,循环卡在长文件的中间,而代码适用于小文件。我成功地传输了一个17636字节的文件,但是当我尝试使用大小为1368622字节的文件时,循环卡在323850字节左右。有什么想法吗?

f1.seekg(0,ios::beg);
            for(i=0;i<val;i++)
            {
                f1.get(ch);
                uch=(unsigned char)ch;
                nret=send(lsocket[index_control],(char*)&uch,sizeof(uch),0);
                if(nret<0)
                {
                    cout<<"\nlsocket["<<index_control<<"] : Network Connection Error.";
                    cout<<"\nlsocket["<<index_control<<"] : Socket Is Now UnBound.";
                    cout<<"\nlsocket["<<index_control<<"] : Abnormal termination of lsocket["<<index_control<<"]";
                    close(lsocket[index_control]);
                    pthread_exit(0);
                }
                cout<<"i="<<i<<"ch="<<ch;
            }
            cout<<"\nlsocket["<<index_control<<"] : File Sent Successfully";

编辑:另一端的客户端使用Java编程。 send,recv函数的对应部分不能在客户端使用。这就是为什么我被迫一次发送1个字节的文件。

1 个答案:

答案 0 :(得分:2)

  

文件发送卡住

您的发送速度比接收方接收的速度快。所有中间套接字缓冲区都已填满,TCP流控制正在阻止发送方。

要解决此问题,您必须发布接收代码。但是,我不知道你为什么一次发送一个字节。这是不好的做法。可怕。发送文件的常规方法如下:

char buffer[8192]; // or more
int count;
while ((count = read(fileFD, buffer, sizeof buffer)) > 0)
{
    if (send(socketFD, buffer, count, 0) < 0)
    {
        perror("send");
        break;
    }
}
  

编辑:另一端的客户端用Java编程。

不相关。

  

send,即recv函数的对应部分不能在客户端使用。

recv()的Java副本InputStream.read(),可以在客户端使用,在其三个重载中的任何一个,并且还有DataInputStream.readFully()

  

这就是为什么我被迫一次发送1个字节的文件。

Non sequitur。此处或其他任何地方都没有强制您一次发送一个字节的内容。