Pastebin is 300% more awesome when you are logged in. Sign Up, it's FREE!
Guest

Untitled

By: SEnergy on Oct 4th, 2012  |  syntax: C++  |  size: 8.56 KB  |  hits: 22  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. //main.cpp
  2. #include <WinSock2.h>
  3. #pragma comment(lib, "ws2_32.lib")
  4.  
  5. #include <Windows.h>
  6. #include "resource.h"
  7. using namespace std;
  8.  
  9. #define BUFSIZE 1024
  10.  
  11. SOCKET s, MainSocket, sock = INVALID_SOCKET;
  12. char ip_addr[16];
  13. int port = 1337;
  14.  
  15. void OnFD_ACCEPT(SOCKET s);
  16. void OnFD_READ(SOCKET s);
  17. void OnFD_CLOSE(SOCKET s);
  18.  
  19. char buf[MAXGETHOSTSTRUCT];
  20.  
  21. HANDLE idTask;
  22.  
  23. bool IsHosting = false;
  24.  
  25. #pragma comment(linker,"\"/manifestdependency:type='win32' \
  26. name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
  27. processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
  28.  
  29. HINSTANCE hInst2;
  30. HWND MainhWnd;
  31.  
  32. BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  33. BOOL CALLBACK ConnectDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  34.  
  35. #define MY_WM_INITDIALOG (WM_USER + 1)
  36. #define WM_SOCKET (WM_USER + 2)
  37. #define WM_DNS (WM_USER + 3)
  38.  
  39. INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR lpCmdLine, INT nShowCmd)
  40. {
  41.         hInst2 = hInst;
  42.  
  43.         UNREFERENCED_PARAMETER(hPrevInst);
  44.         UNREFERENCED_PARAMETER(lpCmdLine);
  45.  
  46.         LoadLibrary("Riched20.dll");
  47.  
  48.         int iConnect = DialogBox(hInst, MAKEINTRESOURCE(IDD_CONNECT), NULL, ConnectDlgProc);
  49.         if(iConnect != IDC_HOST && iConnect != IDC_CONNECT)
  50.                 return 0;
  51.         if(iConnect == IDC_HOST)
  52.         {
  53.                 IsHosting = true;
  54.         }
  55.  
  56.         WNDCLASSEX wClass;
  57.         ZeroMemory(&wClass,sizeof(WNDCLASSEX));
  58.         wClass.cbClsExtra=0;
  59.         wClass.cbSize=sizeof(WNDCLASSEX);
  60.         wClass.cbWndExtra=DLGWINDOWEXTRA;
  61.         wClass.hbrBackground=(HBRUSH)(COLOR_BTNFACE + 1);
  62.         wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
  63.         wClass.hIcon=NULL;
  64.         wClass.hIconSm=NULL;
  65.         wClass.hInstance=hInst;
  66.         wClass.lpfnWndProc=(WNDPROC)MainDlgProc;
  67.         wClass.lpszClassName="SP2P";
  68.         wClass.lpszMenuName=NULL;
  69.         wClass.style=CS_HREDRAW | CS_VREDRAW;
  70.  
  71.         if(!RegisterClassEx(&wClass))
  72.         {
  73.                 int nResult = GetLastError();
  74.                 MessageBox(NULL, "Window Class Creation Failed!", NULL, MB_ICONERROR | MB_OK);
  75.                 return 0;
  76.         }
  77.  
  78.         MainhWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, NULL);
  79.  
  80.         if(!MainhWnd)
  81.         {
  82.                 int nResult = GetLastError();
  83.                 MessageBox(NULL, "Dialog Creation Failed!", NULL, MB_ICONERROR | MB_OK);
  84.                 return 0;
  85.         }
  86.  
  87.         MSG msg;
  88.         ZeroMemory(&msg,sizeof(MSG));
  89.  
  90.         while(GetMessage(&msg, NULL, 0, 0) == TRUE)
  91.         {
  92.                 if(!IsDialogMessage(MainhWnd, &msg))
  93.                 {
  94.                         TranslateMessage(&msg);
  95.                         DispatchMessage(&msg);
  96.                 }
  97.         }
  98.         return msg.wParam;
  99. }
  100.  
  101. BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  102. {
  103.         switch(msg)
  104.         {
  105.         case MY_WM_INITDIALOG:
  106.                 {
  107.                         WORD wVersionRequested = MAKEWORD(2,2);
  108.                         WSADATA data;
  109.                         struct sockaddr_in myAddr;
  110.                         if(IsHosting)
  111.                         {
  112.                                 if (WSAStartup(wVersionRequested, &data) != 0)
  113.                                         return 0;
  114.  
  115.                                 if ((MainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
  116.                                         return 0;
  117.  
  118.                                 myAddr.sin_family = AF_INET;
  119.                                 myAddr.sin_port = htons(port);
  120.                                 myAddr.sin_addr.s_addr = INADDR_ANY;
  121.  
  122.                                 if ((bind(MainSocket, (struct sockaddr*)&myAddr, sizeof(struct sockaddr_in))) == SOCKET_ERROR)
  123.                                         return 0;
  124.  
  125.                                 if (WSAAsyncSelect(MainSocket, hWnd, WM_SOCKET, (FD_ACCEPT|FD_READ)) == SOCKET_ERROR)
  126.                                         return 0;
  127.                                
  128.                                 if (listen(MainSocket, 10) == SOCKET_ERROR)
  129.                                         return 0;
  130.                         }
  131.                         else
  132.                         {
  133.                                 if (WSAStartup(wVersionRequested, &data) != 0)
  134.                                         return 0;
  135.  
  136.                                 if((idTask = WSAAsyncGetHostByAddr(hWnd, WM_DNS, (const char*)ip_addr, sizeof(ip_addr), AF_INET, buf, MAXGETHOSTSTRUCT)) == 0)
  137.                                         return 0;
  138.                         }
  139.                 }
  140.                 break;
  141.         case WM_CREATE:
  142.                 {
  143.                         PostMessage(hWnd, MY_WM_INITDIALOG, 0, 0);
  144.                 }
  145.                 break;
  146.         case WM_DESTROY:
  147.                 {
  148.                         closesocket(s);
  149.                         closesocket(MainSocket);
  150.                         WSACleanup();
  151.                         PostQuitMessage(0);
  152.                         return 0;
  153.                 }
  154.                 break;
  155.         case WM_COMMAND:
  156.                 {
  157.                         switch(LOWORD(wParam))
  158.                         {
  159.                        
  160.                         }
  161.                         break;
  162.                 }
  163.         case WM_SOCKET:
  164.                 {
  165.                         if(WSAGETSELECTERROR(lParam))
  166.                         {
  167.                                 MessageBox(hWnd, "Connection to server failed", "Error", MB_OK|MB_ICONERROR);
  168.                                 SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  169.                                 break;
  170.                         }
  171.                         switch(WSAGETSELECTEVENT(lParam))
  172.                         {
  173.                         case FD_ACCEPT:
  174.                                 {
  175.                                         OnFD_ACCEPT((SOCKET)wParam);
  176.                                         break;
  177.                                 }
  178.                         case FD_READ:
  179.                                 {
  180.                                         OnFD_ACCEPT((SOCKET)wParam);
  181.                                         break;
  182.                                 }
  183.                         case FD_CLOSE:
  184.                                 {
  185.                                         OnFD_CLOSE((SOCKET)wParam);
  186.                                         break;
  187.                                 }
  188.                         }
  189.                         break;
  190.                 }
  191.         case WM_DNS:
  192.                 {
  193.                         if(idTask == (HWND)wParam)
  194.                         {
  195.                                 sockaddr_in addr_ip4;
  196.                                 size_t addrLen = 0;
  197.                                 if(WSAGETASYNCERROR(lParam) != 0)
  198.                                         return 0;
  199.                                 addr_ip4.sin_family = AF_INET;
  200.                                 addr_ip4.sin_port = htons(port);
  201.                                 addr_ip4.sin_addr.S_un.S_addr = inet_addr((const char*)ip_addr);
  202.                                 if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
  203.                                         return 0;
  204.                                 }
  205.                                 if (connect(sock, (SOCKADDR*) &addr_ip4, addrLen) == SOCKET_ERROR){
  206.                                         return 0;
  207.                                 }
  208.                                 if (WSAAsyncSelect(sock, MainhWnd, WM_SOCKET, FD_READ) == SOCKET_ERROR){
  209.                                         return 0;
  210.                                 }
  211.                         }
  212.                         break;
  213.                 }
  214.         }
  215.         return DefWindowProc(hWnd, msg, wParam, lParam);
  216. }
  217.  
  218. BOOL CALLBACK ConnectDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  219. {
  220.         switch(msg)
  221.         {
  222.         case WM_INITDIALOG:
  223.                 {
  224.                         HWND hConnect = GetDlgItem(hWnd, IDC_CONNECT);
  225.                         EnableWindow(hConnect, false);
  226.                         break;
  227.                 }
  228.         case WM_DESTROY:
  229.                 {
  230.                         EndDialog(hWnd, 0);
  231.                         return 0;
  232.                 }
  233.                 break;
  234.         case WM_COMMAND:
  235.                 {
  236.                         switch(LOWORD(wParam))
  237.                         {
  238.                         case IDC_CONNECT:
  239.                                 {
  240.                                         GetDlgItemText(hWnd, IDC_IP, ip_addr, sizeof(ip_addr)/sizeof(ip_addr[0]));
  241.                                         EndDialog(hWnd, IDC_CONNECT);
  242.                                         break;
  243.                                 }
  244.                         case IDC_HOST:
  245.                                 {
  246.                                         EndDialog(hWnd, IDC_HOST);
  247.                                         break;
  248.                                 }
  249.                         case IDC_IP:
  250.                                 {
  251.                                         if(EN_CHANGE == HIWORD(wParam))
  252.                                         {
  253.                                                 HWND hConnect = GetDlgItem(hWnd, IDC_CONNECT);
  254.                                                 char IP[16];
  255.                                                 GetDlgItemText(hWnd, IDC_IP, IP, sizeof(IP)/sizeof(IP[0]));
  256.                                                 BOOL bEnable = (6 < lstrlen(IP));
  257.                                                 EnableWindow(hConnect, bEnable);
  258.                                         }
  259.                                         break;
  260.                                 }
  261.                         }
  262.                         break;
  263.                 }
  264.         }
  265.         return DefWindowProc(hWnd, msg, wParam, lParam);
  266. }
  267.  
  268. void OnFD_ACCEPT(SOCKET s)
  269. {
  270.         struct sockaddr_in remonteAddr;
  271.         int lenght = sizeof(remonteAddr);
  272.     SOCKET newSocket = accept(s, (struct sockaddr *)&remonteAddr, &lenght);
  273.     if (newSocket == INVALID_SOCKET){
  274.         return;
  275.     }
  276.     if (WSAAsyncSelect(newSocket, MainhWnd, WM_SOCKET, FD_READ | FD_CLOSE) == SOCKET_ERROR)
  277.         {
  278.         shutdown(newSocket, SD_BOTH);
  279.         closesocket(newSocket);
  280.         }
  281. }
  282.  
  283. void OnFD_READ(SOCKET s)
  284. {
  285.     int size;
  286.     char buffer[BUFSIZE];
  287.     if ((size = recv(s, buffer, BUFSIZE, 0)) == SOCKET_ERROR)
  288.         {
  289.         WSAAsyncSelect(s, MainhWnd, 0, 0);
  290.         shutdown(s, SD_BOTH);
  291.         closesocket(s);
  292.         return;
  293.     }
  294. }
  295.  
  296. void OnFD_CLOSE(SOCKET s)
  297. {
  298.     WSAAsyncSelect(s, MainhWnd, 0, 0);
  299.     closesocket(s);
  300. }
  301.  
  302. //resource.rc
  303. // Generated by ResEdit 1.5.11
  304. // Copyright (C) 2006-2012
  305. // http://www.resedit.net
  306.  
  307. #include <windows.h>
  308. #include <commctrl.h>
  309. #include <richedit.h>
  310. #include "resource.h"
  311.  
  312.  
  313.  
  314.  
  315. //
  316. // Dialog resources
  317. //
  318. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
  319. IDD_CONNECT DIALOG 0, 0, 117, 41
  320. STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
  321. CAPTION "Connect"
  322. FONT 8, "Ms Shell Dlg"
  323. {
  324.     DEFPUSHBUTTON   "Connect", IDC_CONNECT, 5, 23, 50, 14
  325.     EDITTEXT        IDC_IP, 45, 5, 62, 14, ES_AUTOHSCROLL
  326.     LTEXT           "IP Address:", IDC_STATIC, 4, 7, 37, 8, SS_LEFT
  327.     PUSHBUTTON      "Host", IDC_HOST, 59, 23, 50, 14
  328. }
  329.  
  330.  
  331.  
  332. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
  333. IDD_MAIN DIALOG 0, 0, 290, 189
  334. STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
  335. CAPTION "P2P Main"
  336. CLASS "SP2P"
  337. FONT 8, "Ms Shell Dlg"
  338. {
  339.     DEFPUSHBUTTON   "Send", IDC_SEND, 230, 165, 50, 14
  340.     EDITTEXT        IDC_INPUT, 10, 165, 210, 14, ES_AUTOHSCROLL
  341.     CONTROL         "", IDC_OUTPUT, RICHEDIT_CLASS, WS_TABSTOP | WS_VSCROLL | WS_BORDER | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY, 10, 10, 210, 150
  342.     LISTBOX         IDC_EMOTES, 230, 10, 50, 150, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY
  343. }
  344.  
  345.  
  346. //resource .h
  347. #ifndef IDC_STATIC
  348. #define IDC_STATIC (-1)
  349. #endif
  350.  
  351. #define IDD_MAIN                                101
  352. #define IDD_CONNECT                             104
  353. #define IDC_EMOTES                              1001
  354. #define IDC_SEND                                1002
  355. #define IDC_INPUT                               1004
  356. #define IDC_IP                                  1005
  357. #define IDC_OUTPUT                              40004
  358. #define IDC_CONNECT                             40005
  359. #define IDC_HOST                                40007