java - 文件发送卡在中间[Socket编程]

标签 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 ie receive 函数的对应函数不能在客户端使用。这就是为什么我被迫一次发送 1 个字节的文件。

最佳答案

File sending stuck

您发送的速度比接收者接收的速度快。所有中间套接字缓冲区都已填满,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;
    }
}

Edit : The client at the other end is programmed in Java.

无关紧要。

The counterpart of send ie recv function cannot be used at client.

recv() 的 Java 对应项是 InputStream.read(),它可以在客户端的三个重载中的任何一个中使用,并且还有DataInputStream.readFully()

This is why I'm forced to send 1 byte of file at a time.

不合逻辑。这里或其他任何地方都没有任何东西强制您一次发送一个字节。

关于java - 文件发送卡在中间[Socket编程],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032595/

相关文章:

java - 在调用方法之前不执行任何操作的线程或类

java - 为什么持久化上下文的大小会影响 Hibernate 中的查询时间

java - 远程 EJB3 调用

java - 如何停止在 Netbeans 中启动的 Maven 项目

c++ - C/C++ isspace() 跳过多字节字符串字符

c - 用 C 编写的嵌入式系统中的返回代码值

c - IPv6 组播接口(interface)选择

java - 在 thymeleaf 中包含 JavaScript 变量

c - GIMP 中 Header Pixel 的说明创建了 XPM 图像的 C 头文件

c++ - 如果winsock2套接字是非阻塞的,与其关联的SSL对象是否也会表现出非阻塞行为?