23,121
社区成员
发帖
与我相关
我的任务
分享
/*此程序用来向客户端发送文件
* 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;
}