P2P文件传输.cpp
资源名称:p2p.rar [点击查看]
上传用户:lj0533
上传日期:2022-08-08
资源大小:1392k
文件大小:12k
源码类别:
P2P编程
开发平台:
Visual C++
- // p2p.cpp : 定义应用程序的入口点。
- //
- #include "stdafx.h"
- #include "p2p.h"
- #include "winsock2.h"
- #pragma comment(lib,"ws2_32.lib")
- #include <Commdlg.h>
- #define MAX_LOADSTRING 100
- #include"stdio.h"
- #include"windows.h"
- // 全局变量:
- HINSTANCE hInst; // 当前实例
- TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
- TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
- //// 此代码模块中包含的函数的前向声明:
- ATOM MyRegisterClass(HINSTANCE hInstance);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- //UNREFERENCED_PARAMETER(hPrevInstance);
- //UNREFERENCED_PARAMETER(lpCmdLine);
- // // TODO: 在此放置代码。
- //MSG msg;
- //HACCEL hAccelTable;
- //// 初始化全局字符串
- //LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- //LoadString(hInstance, IDC_P2P, szWindowClass, MAX_LOADSTRING);
- //MyRegisterClass(hInstance);
- //// 执行应用程序初始化:
- //if (!InitInstance (hInstance, nCmdShow))
- //{
- // return FALSE;
- //}
- //hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_P2P));
- //// 主消息循环:
- //while (GetMessage(&msg, NULL, 0, 0))
- //{
- // if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- // {
- // TranslateMessage(&msg);
- // DispatchMessage(&msg);
- // }
- //}
- DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,About);
- //return (int) msg.wParam;
- }
- ////
- //// 函数: MyRegisterClass()
- ////
- //// 目的: 注册窗口类。
- ////
- //// 注释:
- ////
- //// 仅当希望
- //// 此代码与添加到 Windows 95 中的“RegisterClassEx”
- //// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
- //// 这样应用程序就可以获得关联的
- //// “格式正确的”小图标。
- ////
- //ATOM MyRegisterClass(HINSTANCE hInstance)
- //{
- // WNDCLASSEX wcex;
- //
- // wcex.cbSize = sizeof(WNDCLASSEX);
- //
- // wcex.style = CS_HREDRAW | CS_VREDRAW;
- // wcex.lpfnWndProc = WndProc;
- // wcex.cbClsExtra = 0;
- // wcex.cbWndExtra = 0;
- // wcex.hInstance = hInstance;
- // wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_P2P));
- // wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- // wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- // wcex.lpszMenuName = MAKEINTRESOURCE(IDC_P2P);
- // wcex.lpszClassName = szWindowClass;
- // wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
- //
- // return RegisterClassEx(&wcex);
- //}
- //
- ////
- //// 函数: InitInstance(HINSTANCE, int)
- ////
- //// 目的: 保存实例句柄并创建主窗口
- ////
- //// 注释:
- ////
- //// 在此函数中,我们在全局变量中保存实例句柄并
- //// 创建和显示主程序窗口。
- ////
- //BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- //{
- // HWND hWnd;
- //
- // hInst = hInstance; // 将实例句柄存储在全局变量中
- //
- // hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
- // CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
- //
- // if (!hWnd)
- // {
- // return FALSE;
- // }
- //
- // ShowWindow(hWnd, nCmdShow);
- // UpdateWindow(hWnd);
- //
- // return TRUE;
- //}
- //
- ////
- //// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
- ////
- //// 目的: 处理主窗口的消息。
- ////
- //// WM_COMMAND - 处理应用程序菜单
- //// WM_PAINT - 绘制主窗口
- //// WM_DESTROY - 发送退出消息并返回
- ////
- ////
- //LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- //{
- // int wmId, wmEvent;
- // PAINTSTRUCT ps;
- // HDC hdc;
- //
- // switch (message)
- // {
- // case WM_COMMAND:
- // wmId = LOWORD(wParam);
- // wmEvent = HIWORD(wParam);
- // // 分析菜单选择:
- // switch (wmId)
- // {
- // case IDM_ABOUT:
- // DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- // break;
- // case IDM_EXIT:
- // DestroyWindow(hWnd);
- // break;
- // default:
- // return DefWindowProc(hWnd, message, wParam, lParam);
- // }
- // break;
- // case WM_PAINT:
- // hdc = BeginPaint(hWnd, &ps);
- // // TODO: 在此添加任意绘图代码...
- // EndPaint(hWnd, &ps);
- // break;
- // case WM_DESTROY:
- // PostQuitMessage(0);
- // break;
- // default:
- // return DefWindowProc(hWnd, message, wParam, lParam);
- // }
- // return 0;
- //}
- unsigned short nPort;
- char szIP[15];
- WSADATA wsaData;
- char szBufRecv[1000];
- TCHAR szFile[1024]; // 保存获取文件名称的缓冲区。 ;
- sockaddr_in saSrv;
- SOCKET sRecv1;
- SOCKET sRecv2;
- SOCKET sSend1;
- SOCKET sSend2;
- char szBuf[1024];
- char filename[1024];
- // “关于”框的消息处理程序。
- INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- UNREFERENCED_PARAMETER(lParam);
- switch (message)
- {
- case WM_INITDIALOG:
- SetDlgItemText(hDlg,IDC_EDIT_IP,"127.0.0.1");
- //SetDlgItemText(hDlg,IDC_EDIT_PORT,"8888");
- return (INT_PTR)TRUE;
- case WM_COMMAND:
- if(LOWORD(wParam)==IDC_RADIO1)
- SendMessage(GetDlgItem(hDlg,IDC_RADIO1),BM_SETCHECK,BST_CHECKED,0);
- if(LOWORD(wParam)==IDC_RADIO2)
- SendMessage(GetDlgItem(hDlg,IDC_RADIO2),BM_SETCHECK,BST_CHECKED,0);
- if(BST_CHECKED==SendMessage(GetDlgItem(hDlg,IDC_RADIO1),BM_GETCHECK,0,0))
- {
- if (LOWORD(wParam)==IDC_RADIO1)
- {
- //初始化
- WSAStartup(MAKEWORD(2,2),&wsaData); //ws2_32.dll
- //创建套接字
- sRecv1=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
- //bind
- saSrv.sin_family =AF_INET;
- saSrv.sin_addr.S_un.S_addr =INADDR_ANY; //inet_addr("127.0.0.1");
- saSrv.sin_port =htons(7777);
- bind(sRecv1,(sockaddr*)&saSrv,sizeof(saSrv));
- WSAStartup(MAKEWORD(2,2),&wsaData);
- //创建(接收)套接字
- sRecv2=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
- sockaddr_in saSrv;
- saSrv.sin_family=AF_INET;
- saSrv.sin_addr.S_un.S_addr=INADDR_ANY;
- saSrv.sin_port=htons(8888);
- bind(sRecv2,(sockaddr*)&saSrv,sizeof(sockaddr_in));
- }
- if (LOWORD(wParam) == IDOK2)
- {
- memset(filename,0,1024);
- recv(sRecv1,filename,1024,0);
- BOOL GetSaveFileName();
- {
- OPENFILENAME ofn; // 公共对话框结构
- // 初始化选择文件对话框。
- ZeroMemory(&ofn, sizeof(ofn));
- ofn.lStructSize = sizeof(ofn);
- ofn.hwndOwner = NULL;
- ofn.lpstrFile = filename;
- ofn.nMaxFile = sizeof(filename);
- ofn.lpstrFilter = _T("All *.* Text *.TXT ");
- ofn.nFilterIndex = 1;
- ofn.lpstrFileTitle =filename;
- ofn.nMaxFileTitle = 0;
- ofn.lpstrInitialDir = NULL;
- ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
- // 显示打开选择文件对话框。
- if ( GetSaveFileName(&ofn) )
- {
- //显示选择的文件。
- SetDlgItemText(hDlg,IDC_EDIT1,filename);
- return 0;
- }
- }
- shutdown(sRecv1,2);
- closesocket(sRecv1);
- WSACleanup();
- }
- if (LOWORD(wParam) == IDOK3)
- {
- recv(sRecv2,filename,1024,0);
- FILE *fp; //定义文件类型的指针
- fp=fopen(filename,"wb");
- char buf[1024];
- memset(buf,0,1024);
- int nNumRead =1;
- while(nNumRead)
- {
- nNumRead = recv(sRecv2,buf,1024, 0 );
- fwrite(buf, 1, nNumRead, fp );
- }
- MessageBox(hDlg,"接收完成","",MB_OK);
- return FALSE;
- fclose(fp);
- shutdown( sRecv2,2);
- closesocket(sRecv2);
- WSACleanup();
- }
- }
- if(BST_CHECKED==SendMessage(GetDlgItem(hDlg,IDC_RADIO2),BM_GETCHECK,0,0))
- {
- if(LOWORD(wParam)==IDOK2)
- {
- //初始化
- WSAStartup(MAKEWORD(2,2),&wsaData);
- //创建套接字
- sSend1=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
- if(sSend1==INVALID_SOCKET)
- {
- MessageBox(hDlg,"创建套接字失败","",MB_OK);
- break;
- }
- sockaddr_in saDst;
- saDst.sin_family=AF_INET;
- WORD nPort;
- GetDlgItemText(hDlg,IDC_EDIT_IP,szIP,15);
- //GetDlgItemText(hDlg,IDC_EDIT2,szPort,5);
- saDst.sin_addr.S_un.S_addr=inet_addr(szIP);
- saDst.sin_port=htons(7777);
- BOOL GetOpenFileName();
- {
- OPENFILENAME ofn; // 公共对话框结构。
- // 初始化选择文件对话框。
- ZeroMemory(&ofn, sizeof(ofn));
- ofn.lStructSize = sizeof(ofn);
- ofn.hwndOwner =NULL;
- ofn.lpstrFile = szFile;
- ofn.lpstrFile[0] = _T(' ');
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFilter = _T("All *.* Text *.TXT ");
- ofn.nFilterIndex = 1;
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- ofn.lpstrInitialDir = NULL;
- ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
- // 显示打开选择文件对话框。
- if ( GetOpenFileName(&ofn) )
- {
- //显示选择的文件。
- SetDlgItemText(hDlg,IDC_EDIT1,szFile);
- GetDlgItemText(hDlg,IDC_EDIT1,szFile,1024);
- sendto(sSend1,szFile,strlen(szFile),0,(sockaddr*)&saDst,sizeof(saDst));
- //shutdown(sSend1, 2);
- //closesocket(sSend1);
- //WSACleanup();
- }
- }
- }
- if (LOWORD(wParam) == IDOK)
- {
- WSAStartup(MAKEWORD(2,2),&wsaData);
- //创建套接字
- sSend2=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
- if(sSend2==INVALID_SOCKET)
- {
- MessageBox(hDlg,"创建套接字失败","",MB_OK);
- break;
- }
- sockaddr_in saDst;
- saDst.sin_family=AF_INET;
- WORD nPort;
- GetDlgItemText(hDlg,IDC_EDIT_IP,szIP,15);
- saDst.sin_addr.S_un.S_addr=inet_addr(szIP);
- saDst.sin_port=htons(8888);
- GetDlgItemText(hDlg,IDC_EDIT1,szFile,1024);
- FILE *fp; //定义文件类型的指针
- char filename[1024];
- strcpy(filename,szFile);
- fp=fopen(filename,"rb");
- if(fp==NULL)
- {
- MessageBox(hDlg,"文件打开失败","",MB_OK);
- return TRUE;
- }
- char buf[1024];
- memset(buf,0,1024);
- int nNumRead = 0;
- while( !feof( fp) )
- {
- nNumRead = fread( buf, 1, 1024, fp );
- int nCount=sendto(sSend2,buf,strlen(buf),0,(sockaddr*)&saDst,sizeof(saDst));
- if(nCount==SOCKET_ERROR)
- {
- MessageBox(hDlg,"发送数据失败","",MB_OK);
- return FALSE;
- }
- }
- fclose(fp);
- shutdown(sSend2, 2 );
- closesocket(sSend2);
- WSACleanup();
- MessageBox(hDlg,"发送完成","",MB_OK);
- return FALSE;
- }
- }
- if (LOWORD(wParam) == IDCANCEL)
- {
- EndDialog(hDlg, LOWORD(wParam));
- return (INT_PTR)TRUE;
- }
- break;
- }
- return (INT_PTR)FALSE;
- }