用socket传输文件时出现Connection reset by peer错误

hnrzzk 2013-03-07 05:14:13
我想通过socket把文件夹从服务器传到客户端
/*此程序用来向客户端发送文件
* Server.cpp
*
* Created on: 2013-3-5
* Author: root
*/

#include <iostream>
#include <netinet/in.h> // sockaddr_in头文件
#include <sys/types.h> // socket头文件
#include <sys/socket.h> // socket头文件
#include <stdio.h> //
#include <fstream>
#include <stddef.h>
#include <arpa/inet.h> // inet_ntoa头文件
#include <string.h> // bzero头文件
#include <dirent.h> //

using namespace std;
#define DIRPATH "/home/zhangkai/CAC-2013-01-20/"

struct Message
{
string FileName;
int Legnth;
char info[1024];
};

int main()
{
struct sockaddr_in Server_Addr,Client_Addr;
int Socket_Server,Socket_Client;

Message Buffer;
int SendLength; //本次传输的字节数
struct dirent *ptr;
DIR *dir;
dir=opendir(DIRPATH);

//创建套接字
Socket_Server=socket(AF_INET, SOCK_STREAM, 0);
if(Socket_Server==-1)
{
perror("套接字创建失败!");
return -1;
}
cout<<"套接字创建成功!"<<endl;

//绑定端口地址
Server_Addr.sin_addr.s_addr=INADDR_ANY;
Server_Addr.sin_family=AF_INET;
Server_Addr.sin_port=htons(7777);
bzero(&(Server_Addr.sin_zero), 8);
if(bind(Socket_Server,(const sockaddr*)&Server_Addr,sizeof(Server_Addr))==-1)
{
perror("绑定失败!");
return -1;
}
cout<<"绑定成功!"<<endl;

//监听端口
if(listen(Socket_Server,10)==-1)
{
perror("监听端口时发生错误!");
return -1;
}
cout<<"正在监听端口:7777"<<endl;
cout<<"正在等待远程客户端的链接请求……"<<endl;

while(1)
{
socklen_t SocketClient_Size = sizeof(struct sockaddr_in);
Socket_Client=accept(Socket_Server,(struct sockaddr*) &Client_Addr,&SocketClient_Size);
if(Socket_Client==-1)
{
perror("响应端口时发生错误!");
return -1;
}
cout<<"收到来自"<<(char*)inet_ntoa(Client_Addr.sin_addr)<<"的链接"<<endl;

while(1)
{
fstream FileToBuffer;
ptr=readdir(dir);
if(ptr==NULL)
break;
if(ptr->d_name[0] == '.')
continue;
string FileName=ptr->d_name;
Buffer.FileName=DIRPATH+FileName;
FileToBuffer.open(Buffer.FileName.c_str(),ios::in);
if(!FileToBuffer)
{
cout<<"文件"<<Buffer.FileName<<"打开失败!"<<endl;
return -1;
}

//获得文件长度
FileToBuffer.seekg(0,ios::end);
Buffer.Legnth=FileToBuffer.tellg();
FileToBuffer.seekg(0,ios::beg);

while(!FileToBuffer.eof())
{
if(Buffer.Legnth>1024)
{
FileToBuffer.read((char *)&Buffer.info,1024);
SendLength=send(Socket_Client,(void*)&Buffer,sizeof(Buffer),0);
//Buffer.Legnth-=SendLength;
}
else
{
FileToBuffer.read((char *)&Buffer.info,Buffer.Legnth);
SendLength=send(Socket_Client,(void*)&Buffer,sizeof(Buffer),0);
//Buffer.Legnth-=SendLength;
cout<<Buffer.FileName<<endl;
}

if(SendLength==-1)
{
perror("发送信息失败!");
return -1;
}
}
FileToBuffer.close();
}
close(Socket_Client);
}

return 0;
}


/*此程序用来接收服务端发送的文件
* Client.cpp
*
* Created on: 2013-3-5
* Author: root
*/

#include <iostream>
#include <netinet/in.h> // sockaddr_in头文件
#include <sys/types.h> // socket头文件
#include <sys/socket.h> // socket头文件
#include <stdio.h> //
#include <fstream>
#include <stddef.h>
#include <arpa/inet.h> // inet_ntoa头文件
#include <string.h> // bzero头文件

using namespace std;
#define DIRPATH "/home/zhangkai/1/"

struct Message
{
string FileName;
int Legnth;
char info[1024];
};

int main()
{
struct sockaddr_in Server_addr;

Message Buffer;
int Socket;

//创建套接字
Socket=socket(AF_INET,SOCK_STREAM,0);
if(Socket==-1)
{
perror("套接字创建失败!");
return -1;
}

//绑定端口地址
bzero(&Server_addr,sizeof(Server_addr));
Server_addr.sin_family=AF_INET;
Server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //inet_addr将一个点分十进制的IP转换成一个长整数型数
Server_addr.sin_port=htons(7777);

//建立链接
if(connect(Socket,(struct sockaddr *) &Server_addr,sizeof(struct sockaddr))==-1)
{
perror("链接服务器失败!");
return -1;
}
cout<<"正在从服务器接收信息……"<<endl;

//接收文件
while(1)
{

int ReceiveNum;
//memset((void *)&Buffer,0,sizeof(Message));
ReceiveNum=recv(Socket,(void *)&Buffer,sizeof(Buffer),0); //这句之后就无法执行
cout<<ReceiveNum<<endl;
if(ReceiveNum==-1)
{
perror("接收文件失败!");
break;
}

fstream BufferToFile;
string FilePath=DIRPATH+Buffer.FileName;
BufferToFile.open(FilePath.c_str(),ios::out);
if(!BufferToFile)
{
perror("文件打开失败!");
return -1;
}

if(Buffer.Legnth<1024)
{
BufferToFile.write((char *)&Buffer.info,Buffer.Legnth);
BufferToFile.flush();
BufferToFile.close();
cout<<"!"<<endl;
}
else
{
BufferToFile.write((char *)&Buffer.info,sizeof(Buffer.info));
BufferToFile.flush();
cout<<"@"<<endl;
}

}
close(Socket);
return 0;
}

服务器端在发送几个文件后会出现“发送信息失败!: Connection reset by peer”
客户端并没有报错,但是在recv之后就无法执行
...全文
903 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hshibin 2013-07-15
  • 打赏
  • 举报
回复
敢问楼主解决问题了吗?我也遇到相同的问题。就是找不到解决方案。如果一直重连,会导致程序很不稳定
hshibin 2013-07-15
  • 打赏
  • 举报
回复
引用 楼主 hnrzzk 的回复:
我想通过socket把文件夹从服务器传到客户端
/*此程序用来向客户端发送文件
 * Server.cpp
 *
 *  Created on: 2013-3-5
 *      Author: root
 */

#include <iostream>
#include <netinet/in.h>    // sockaddr_in头文件
#include <sys/types.h>     // socket头文件
#include <sys/socket.h>    // socket头文件
#include <stdio.h>         //
#include <fstream>
#include <stddef.h>
#include <arpa/inet.h>     // inet_ntoa头文件
#include <string.h>        // bzero头文件
#include <dirent.h>        //

using namespace std;
#define DIRPATH "/home/zhangkai/CAC-2013-01-20/"

struct Message
{
	string FileName;
    int Legnth;
    char info[1024];
};

int main()
{
	struct sockaddr_in Server_Addr,Client_Addr;
	int Socket_Server,Socket_Client;

	Message Buffer;
	int SendLength;          //本次传输的字节数
	struct dirent *ptr;
	DIR *dir;
	dir=opendir(DIRPATH);

	//创建套接字
	Socket_Server=socket(AF_INET, SOCK_STREAM, 0);
	if(Socket_Server==-1)
	{
		perror("套接字创建失败!");
		return -1;
	}
	cout<<"套接字创建成功!"<<endl;

	//绑定端口地址
	Server_Addr.sin_addr.s_addr=INADDR_ANY;
	Server_Addr.sin_family=AF_INET;
	Server_Addr.sin_port=htons(7777);
	bzero(&(Server_Addr.sin_zero), 8);
	if(bind(Socket_Server,(const sockaddr*)&Server_Addr,sizeof(Server_Addr))==-1)
	{
		perror("绑定失败!");
		return -1;
	}
	cout<<"绑定成功!"<<endl;

	//监听端口
	if(listen(Socket_Server,10)==-1)
	{
		perror("监听端口时发生错误!");
		return -1;
	}
	cout<<"正在监听端口:7777"<<endl;
    cout<<"正在等待远程客户端的链接请求……"<<endl;

	while(1)
	{
		socklen_t SocketClient_Size = sizeof(struct sockaddr_in);
		Socket_Client=accept(Socket_Server,(struct sockaddr*) &Client_Addr,&SocketClient_Size);
		if(Socket_Client==-1)
		{
			perror("响应端口时发生错误!");
			return -1;
		}
		cout<<"收到来自"<<(char*)inet_ntoa(Client_Addr.sin_addr)<<"的链接"<<endl;

		while(1)
		{
			fstream FileToBuffer;
			ptr=readdir(dir);
			if(ptr==NULL)
				break;
			if(ptr->d_name[0] == '.')
			    continue;
			string FileName=ptr->d_name;
			Buffer.FileName=DIRPATH+FileName;
			FileToBuffer.open(Buffer.FileName.c_str(),ios::in);
			if(!FileToBuffer)
			{
				cout<<"文件"<<Buffer.FileName<<"打开失败!"<<endl;
				return -1;
			}

			//获得文件长度
			FileToBuffer.seekg(0,ios::end);
			Buffer.Legnth=FileToBuffer.tellg();
			FileToBuffer.seekg(0,ios::beg);

			while(!FileToBuffer.eof())
			{
				if(Buffer.Legnth>1024)
				{
					FileToBuffer.read((char *)&Buffer.info,1024);
					SendLength=send(Socket_Client,(void*)&Buffer,sizeof(Buffer),0);
					//Buffer.Legnth-=SendLength;
				}
				else
				{
					FileToBuffer.read((char *)&Buffer.info,Buffer.Legnth);
					SendLength=send(Socket_Client,(void*)&Buffer,sizeof(Buffer),0);
					//Buffer.Legnth-=SendLength;
					cout<<Buffer.FileName<<endl;
				}

				if(SendLength==-1)
				{
					perror("发送信息失败!");
					return -1;
				}
			}
			FileToBuffer.close();
		}
		close(Socket_Client);
	}

	return 0;
}
/*此程序用来接收服务端发送的文件
 * Client.cpp
 *
 *  Created on: 2013-3-5
 *      Author: root
 */

#include <iostream>
#include <netinet/in.h>    // sockaddr_in头文件
#include <sys/types.h>     // socket头文件
#include <sys/socket.h>    // socket头文件
#include <stdio.h>         //
#include <fstream>
#include <stddef.h>
#include <arpa/inet.h>      // inet_ntoa头文件
#include <string.h>        // bzero头文件

using namespace std;
#define DIRPATH "/home/zhangkai/1/"

struct Message
{
	string FileName;
    int Legnth;
    char info[1024];
};

int main()
{
	struct sockaddr_in Server_addr;

	Message Buffer;
	int Socket;

	//创建套接字
	Socket=socket(AF_INET,SOCK_STREAM,0);
	if(Socket==-1)
	{
		perror("套接字创建失败!");
		return -1;
	}

	//绑定端口地址
	bzero(&Server_addr,sizeof(Server_addr));
	Server_addr.sin_family=AF_INET;
	Server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");   //inet_addr将一个点分十进制的IP转换成一个长整数型数
	Server_addr.sin_port=htons(7777);

	//建立链接
	if(connect(Socket,(struct sockaddr *) &Server_addr,sizeof(struct sockaddr))==-1)
	{
		perror("链接服务器失败!");
		return -1;
	}
	cout<<"正在从服务器接收信息……"<<endl;

	//接收文件
	while(1)
	{

		int ReceiveNum;
		//memset((void *)&Buffer,0,sizeof(Message));
		ReceiveNum=recv(Socket,(void *)&Buffer,sizeof(Buffer),0);  //这句之后就无法执行
		cout<<ReceiveNum<<endl;
		if(ReceiveNum==-1)
		{
			perror("接收文件失败!");
			break;
		}

		fstream BufferToFile;
		string FilePath=DIRPATH+Buffer.FileName;
		BufferToFile.open(FilePath.c_str(),ios::out);
		if(!BufferToFile)
		{
			perror("文件打开失败!");
			return -1;
		}

		if(Buffer.Legnth<1024)
		{
			BufferToFile.write((char *)&Buffer.info,Buffer.Legnth);
			BufferToFile.flush();
			BufferToFile.close();
			cout<<"!"<<endl;
		}
		else
		{
			BufferToFile.write((char *)&Buffer.info,sizeof(Buffer.info));
			BufferToFile.flush();
			cout<<"@"<<endl;
		}

	}
	close(Socket);
	return 0;
}
服务器端在发送几个文件后会出现“发送信息失败!: Connection reset by peer” 客户端并没有报错,但是在recv之后就无法执行
那要如何处理呢?
hnrzzk 2013-03-08
  • 打赏
  • 举报
回复
貌似send传送的那个结构不对,那个string应该改成char【】
hnrzzk 2013-03-07
  • 打赏
  • 举报
回复
我觉得应该是客户端出现异常的原因。。。 难道是ReceiveNum=recv(Socket,(void *)&Buffer,sizeof(Buffer),0);这句话有问题?
qq120848369 2013-03-07
  • 打赏
  • 举报
回复
RST了,说明对端FIN了。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧