日期:2014-05-16  浏览次数:20853 次

用socket传输文件时出现Connection reset by peer错误
我想通过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;
}