socket传输文件时出现Connection reset by peer错误
我想通过socket把文件夹从服务器传到客户端
C/C++ code?/*此程序用来向客户端发送文件 * 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; }
C/C++ code?/*此程序用来接收服务端发送的文件 * 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之后就无法执行
RST了,说明对端FIN了。
我觉得应该是客户端出现异常的原因。。。
难道是ReceiveNum=recv(Socket,(void *)&Buffer,sizeof(Buffer),0);这句话有问题?