以下是我用来将文件发送到连接的代码片段。我面临的奇怪的事情是,对于长文件,循环卡在中间,而代码对于小文件则完美。我成功传输了 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/