以下是我用来将文件发送到连接的代码段。我面临的奇怪之处在于,循环卡在长文件的中间,而代码适用于小文件。我成功地传输了一个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个字节的文件。
答案 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。此处或其他任何地方都没有强制您一次发送一个字节的内容。