#include "ServerSocket.h"
#include <iostream>
using namespace std;
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <assert.h>
#include <string.h>
const int maxEvents = 100;
ServerSocket::ServerSocket(char *ip, short port)
{
listenFd = socket(AF_INET, SOCK_STREAM, 0);
assert(-1 != listenFd);
struct sockaddr_in ser;
memset(&ser, 0, sizeof(ser));
ser.sin_family = AF_INET;
ser.sin_port = htons(port);
ser.sin_addr.s_addr = inet_addr(ip);
int res = bind(listenFd, (struct sockaddr*)&ser, sizeof(ser));
assert(-1 != res);
listen(listenFd, 5);
epollFd = epoll_create(5);
assert(-1 != epollFd);
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = listenFd;
epoll_ctl(epollFd, EPOLL_CTL_ADD, listenFd, &event);
}
ServerSocket::~ServerSocket()
{
close(listenFd);
close(epollFd);
}
void ServerSocket::Start()
{
while(1)
{
struct epoll_event orderEvents[maxEvents];
int n = epoll_wait(epollFd, orderEvents, maxEvents, -1);
int i = 0;
for(; i < n; ++i)
{
int fd = orderEvents[i].data.fd;
if(fd == listenFd)
{
AcceptClientLink();
}
else
{
if(orderEvents[i].events & EPOLLRDHUP)
{
close(fd);
epoll_ctl(epollFd, EPOLL_CTL_DEL, fd, NULL);
}
else if(orderEvents[i].events & EPOLLIN)
{
RecvData(fd);
}
else
{
cout<<"event is error"<<endl;
}
}
}
}
}
void ServerSocket::AcceptClientLink()
{
struct sockaddr_in cli;
socklen_t len = (socklen_t)sizeof(cli);
int c = accept(listenFd, (struct sockaddr*)&cli, &len);
if(-1 == c)
{
cout<<"one client link error"<<endl;
return;
}
struct epoll_event event;
event.events = EPOLLIN | EPOLLRDHUP;
event.data.fd = c;
epoll_ctl(epollFd, EPOLL_CTL_ADD, c, &event);
}
void ServerSocket::RecvData(int fd)
{
Data data; // type command
memset(&data, 0, sizeof(data));
int n = recv(fd, &data, sizeof(data), 0);
if(n <= 0)
{
return;
}
switch(data.type)
{
case 1:
CarryOutCmd(fd, data.command);
break;
case 2:
RecvFile(fd, data.command);
break;
case 3:
SendFile(fd, data.command);
break;
default:
send(fd, "type error", 10, 0);
break;
}
}
void ServerSocket::CmdCd(char *path)
{
chdir(path);
}
// 服务器执行系统命令,将执行结果发送给客户端
void ServerSocket::CarryOutCmd(int fd, char *cmd)
{
char *argv[128] = {0};
char *p = strtok(cmd, " ");
int count = 0;
while(p != NULL)
{
argv[count++] = p;
p = strtok(NULL, " ");
}
if(strncmp(argv[0], "cd", 2) == 0)
{
CmdCd(argv[1]);
char path[128] = {0};
getcwd(path, 127);
send(fd, path, strlen(path), 0);
return;
}
int fds[2] = {-1,-1};
pipe(fds);
pid_t pid = fork();
assert(-1 != pid);
if(pid == 0)
{
close(1);
close(2);
dup(fds[1]);
dup(fds[1]);
char path[128] = "/bin/";
strcat(path, argv[0]);
execv(path, argv);
}
else
{
close(fds[1]);
int flag = 0;
while(1)
{
char buff[128] = {0};
int n = read(fds[0], buff, 127);
if(n <= 0)
{
break;
}
flag = 1;
send(fd, buff, n, 0);
}
if(!flag)
send(fd, "success", strlen("success"), 0);
close(fds[0]);
}
return;
}
没有合适的资源?快使用搜索试试~ 我知道了~
c++ 文件传输项目源码(含socket服务器端以及客户端)
共5个文件
cpp:3个
h:2个
需积分: 5 5 下载量 73 浏览量
2023-11-09
15:11:45
上传
评论 1
收藏 3KB ZIP 举报
温馨提示
FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。 FTP的文件传输涉及到客户端和服务器。一般情况下,我们的电脑作为FTP客户端去和FTP服务器连接来获取FTP服务器上的文件或者上传文件到FTP服务器。 下面我简单的讲讲Windows系统中的FTP客户端如何与FTP服务器下载或者上传文件。
资源推荐
资源详情
资源评论
收起资源包目录
c++ 文件传输项目源码(含socket服务器端以及客户端).zip (5个子文件)
c++ 文件传输项目源码(含socket服务器端以及客户端)
ServerSocket.cpp 3KB
ser.cpp 398B
FileTrans.cpp 148B
ServerSocket.h 338B
FileTrans.h 184B
共 5 条
- 1
资源评论
童小纯
- 粉丝: 3w+
- 资源: 289
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功