毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

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

更新时间:2013-7-16:  来源:毕业论文

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);这句话有问题?

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。