home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / winsock / ipxchat / connect.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  10KB  |  340 lines

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1993-1997  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   connect.c
  9. //
  10. //  PURPOSE:   Displays the "Connect" dialog box
  11. //
  12. //  FUNCTIONS:
  13. //    CmdConnect        - Displays the "Connect" dialog box
  14. //    Connect           - Processes messages for "Connect" dialog box.
  15. //    MsgConnectInit    - Initializes edit controls
  16. //    MsgConnectCommand - Process WM_COMMAND message sent to the connect box.
  17. //    CmdConnectDone    - Free the connect box and related data.
  18. //    CmdConnectNow     - Establishes connection to specified address. Kills
  19. //                        dialog if successful.
  20. //
  21. //  COMMENTS:
  22. //
  23. //
  24.  
  25. #include <windows.h>            // required for all Windows applications
  26. #include <windowsx.h>
  27. #include <wsipx.h>              // IPX sockets
  28. #include <stdlib.h>
  29. #include <stdio.h>
  30. #include "globals.h"            // prototypes specific to this application
  31.  
  32. //   Function Definitions
  33.  
  34.  
  35. LRESULT CALLBACK Connect(HWND, UINT, WPARAM, LPARAM);
  36. LRESULT MsgConnectInit(HWND, UINT, WPARAM, LPARAM);
  37. LRESULT MsgConnectCommand(HWND, UINT, WPARAM, LPARAM);
  38. LRESULT CmdConnectNow(HWND, WORD, WORD, HWND);
  39. LRESULT CmdConnectDone(HWND, WORD, WORD, HWND);
  40.  
  41. // Connect dialog message table definition.
  42. MSD rgmsdConnect[] =
  43. {
  44.     {WM_COMMAND,    MsgConnectCommand},
  45.     {WM_INITDIALOG, MsgConnectInit}
  46. };
  47.  
  48. MSDI msdiConnect =
  49. {
  50.     sizeof(rgmsdConnect) / sizeof(MSD),
  51.     rgmsdConnect,
  52.     edwpNone
  53. };
  54.  
  55. // Connect dialog command table definition.
  56. CMD rgcmdConnect[] =
  57. {
  58.     {IDOK,     CmdConnectNow},
  59.     {IDCANCEL, CmdConnectDone}
  60. };
  61.  
  62. CMDI cmdiConnect =
  63. {
  64.     sizeof(rgcmdConnect) / sizeof(CMD),
  65.     rgcmdConnect,
  66.     edwpNone
  67. };
  68.  
  69. // Module specific "globals"  Used when a variable needs to be
  70. // accessed in more than one handler function.
  71.  
  72. HFONT hfontDlg;
  73.  
  74. //
  75. //  FUNCTION: CmdConnect(HWND, WORD, WORD, HWND)
  76. //
  77. //  PURPOSE: Displays the "Connect" dialog box
  78. //
  79. //  PARAMETERS:
  80. //    hwnd      - Window handle
  81. //    wCommand  - IDM_CONNECT (unused)
  82. //    wNotify   - Notification number (unused)
  83. //    hwndCtrl  - NULL (unused)
  84. //
  85. //  RETURN VALUE:
  86. //
  87. //    Always returns 0 - Message handled
  88. //
  89. //  COMMENTS:
  90. //    To process the IDM_CONNECT message, call DialogBox() to display the
  91. //    Connect dialog box.
  92.  
  93. LRESULT CmdConnect(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  94. {
  95.     HMENU hmenu;
  96.  
  97.     SetWindowText(hwnd, "IPX Chat Client");    // Change Window Title
  98.  
  99.     // Start dialog box
  100.     if(DialogBox(hInst, "ConnectBox", hwnd, (DLGPROC)Connect))
  101.     {
  102.         
  103.         // We have a connection!  Set up message notification if
  104.         // data ready to be read or if connection is closed on us
  105.         if (WSAAsyncSelect(sock,
  106.                            hwnd,
  107.                            MW_DATAREADY,
  108.                            FD_READ | FD_CLOSE) == SOCKET_ERROR) 
  109.         {
  110.             MessageBox(hwnd, "WSAAsyncSelect Failed!", NULL, MB_OK);
  111.             CleanUp();
  112.             return 0;
  113.         }
  114.  
  115.         // Connect has succeeded!  Fix menus
  116.         hmenu = GetMenu(hwnd);
  117.         EnableMenuItem(hmenu, IDM_CONNECT, MF_GRAYED);
  118.         EnableMenuItem(hmenu, IDM_LISTEN, MF_GRAYED);
  119.         EnableMenuItem(hmenu, IDM_DISCONNECT, MF_ENABLED);
  120.         return 0;
  121.     }
  122.  
  123.     // Connection failed - reset window title
  124.     SetWindowText(hwnd, szTitle);
  125.     return 0;
  126. }
  127.  
  128.  
  129. //
  130. //  FUNCTION: Connect(HWND, UINT, WPARAM, LPARAM)
  131. //
  132. //  PURPOSE:  Processes messages for "Connect" dialog box.
  133. //
  134. //  PARAMETERS:
  135. //    hdlg - window handle of the dialog box
  136. //    wMessage - type of message
  137. //    wparam - message-specific information
  138. //    lparam - message-specific information
  139. //
  140. //  RETURN VALUE:
  141. //    TRUE - message handled
  142. //    FALSE - message not handled
  143. //
  144. //  COMMENTS:
  145. //
  146. //     Gets connection information from user and then establishes a connection.
  147. //
  148. //     Connect when user clicks on the OK button.  Kill Dialog when connection
  149. //     established.
  150. //
  151.  
  152. LRESULT CALLBACK Connect(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  153. {
  154.     return DispMessage(&msdiConnect, hdlg, uMessage, wparam, lparam);
  155. }
  156.  
  157.  
  158. //
  159. //  FUNCTION: MsgConnectInit(HWND, UINT, WPARAM, LPARAM)
  160. //
  161. //  PURPOSE: To center dialog and limit size of edit controls
  162. //
  163. //  PARAMETERS:
  164. //    hdlg - The window handing the message.
  165. //    uMessage - The message number. (unused).
  166. //    wparam - Message specific data (unused).
  167. //    lparam - Message specific data (unused).
  168. //
  169. //  RETURN VALUE:
  170. //    Always returns 0 - message handled.
  171. //
  172. //  COMMENTS:
  173. //    Set size of edit controls for the following
  174. //           Network  8  chars (4 2-digit hex numbers)
  175. //           Node     12 chars (6 2-digit hex numbers)
  176. //           Socket   4  chars (2 2-digit hex numbers)
  177. //
  178.  
  179. LRESULT MsgConnectInit(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  180. {
  181.  
  182.     // Create a font to use
  183.     hfontDlg = CreateFont(14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  184.                           VARIABLE_PITCH | FF_SWISS, "");
  185.  
  186.     // Center the dialog over the application window
  187.     CenterWindow (hdlg, GetWindow (hdlg, GW_OWNER));
  188.  
  189.     // Limit size of edit controls
  190.     SendDlgItemMessage(hdlg, CD_NETWORK, EM_LIMITTEXT, 8, 0);
  191.     SendDlgItemMessage(hdlg, CD_NODE, EM_LIMITTEXT, 12, 0);
  192.     SendDlgItemMessage(hdlg, CD_SOCKET, EM_LIMITTEXT, 4, 0);
  193.  
  194.     // Initialize Edit Controls
  195.     SetDlgItemText(hdlg, CD_NETWORK, szConnectNetwork);
  196.     SetDlgItemText(hdlg, CD_NODE, szConnectNode);
  197.     SetDlgItemText(hdlg, CD_SOCKET, szConnectSocket);
  198.      
  199.     return (TRUE);
  200. }
  201.  
  202. //
  203. //  FUNCTION: MsgConnectCommand(HWND, UINT, WPARAM, LPARAM)
  204. //
  205. //  PURPOSE: Process WM_COMMAND message sent to the Connect box.
  206. //
  207. //  PARAMETERS:
  208. //    hwnd - The window handing the message.
  209. //    uMessage - The message number. (unused).
  210. //    wparam - Message specific data (unused).
  211. //    lparam - Message specific data (unused).
  212. //
  213. //  RETURN VALUE:
  214. //    Always returns 0 - message handled.
  215. //
  216. //  COMMENTS:
  217. //    Uses this DispCommand function defined in wndproc.c combined
  218. //    with the cmdiConnect structure defined in this file to handle
  219. //    the command messages for the Connect dialog box.
  220. //
  221.  
  222. LRESULT MsgConnectCommand(HWND   hwnd, 
  223.                         UINT   uMessage, 
  224.                         WPARAM wparam, 
  225.                         LPARAM lparam)
  226. {
  227.     return DispCommand(&cmdiConnect, hwnd, wparam, lparam);
  228. }
  229.  
  230. //
  231. //  FUNCTION: CmdConnectDone(HWND, WORD, HWND)
  232. //
  233. //  PURPOSE: Free the Connect box and related data.
  234. //
  235. //  PARAMETERS:
  236. //    hdlg - The window handling the command.
  237. //    wCommand - The command to be handled (unused).
  238. //    wNotify   - Notification number (unused)
  239. //    hwndCtrl - NULL (unused).
  240. //
  241. //  RETURN VALUE:
  242. //    Always returns TRUE.
  243. //
  244. //  COMMENTS:
  245. //    Cleans up sockets then calls EndDialog to finish the dialog session.
  246. //
  247.  
  248. LRESULT CmdConnectDone(HWND hdlg, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  249. {
  250.  
  251.     CleanUp();               // Free any aborted socket resources
  252.     EndDialog(hdlg, FALSE);  // Exit Dialog -- rtrn false since no connection
  253.     return TRUE;
  254. }
  255.  
  256. //
  257. //  FUNCTION: CmdConnectNow(HWND, WORD, HWND)
  258. //
  259. //  PURPOSE: Establish the connection
  260. //
  261. //  PARAMETERS:
  262. //    hdlg - The window handling the command.
  263. //    wCommand - The command to be handled (unused).
  264. //    wNotify   - Notification number (unused)
  265. //    hwndCtrl - NULL (unused).
  266. //
  267. //  RETURN VALUE:
  268. //    Always returns TRUE.
  269. //
  270. //  COMMENTS:
  271. //    Makes Connection calls
  272. //
  273.  
  274. LRESULT CmdConnectNow(HWND hdlg, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  275. {
  276.     char outtext[128];
  277.     WORD wVersionRequested;
  278.     WSADATA wsaData;
  279.  
  280.     
  281.     GetDlgItemText(hdlg, CD_NETWORK, szConnectNetwork, 9);        // Get Network Number
  282.     AtoH(szConnectNetwork, (char *)&RemAddr.sa_netnum, 4);        // Network order
  283.  
  284.     GetDlgItemText(hdlg, CD_NODE, szConnectNode, 13);             // Get Node Number
  285.     AtoH((char *)szConnectNode, (char *)&RemAddr.sa_nodenum, 6);  // Network order
  286.  
  287.     GetDlgItemText(hdlg, CD_SOCKET, szConnectSocket, 5);          // Get Socket Number
  288.     AtoH((char *)szConnectSocket, (char *)&RemAddr.sa_socket, 2); // Network order                  
  289.  
  290.     RemAddr.sa_family = AF_IPX;                                   // IPX Family
  291.     wVersionRequested = MAKEWORD(1, 1);
  292.  
  293.     SetDlgItemText(hdlg, CD_STATUS, "Calling WSAStartup");
  294.  
  295.     // Initialize winsock dll
  296.     if(WSAStartup(wVersionRequested, &wsaData) == SOCKET_ERROR)
  297.     {
  298.         SetDlgItemText(hdlg, CD_STATUS, "WSAStartup failed");
  299.         return TRUE;
  300.     }
  301.  
  302.     SetDlgItemText(hdlg, CD_STATUS, "WSAStartup Succeeded");
  303.  
  304.     SetDlgItemText(hdlg, CD_STATUS, "Calling socket()");
  305.  
  306.     // get socket handle
  307.     sock = socket(AF_IPX,            // IPX family
  308.                   SOCK_SEQPACKET,    // Message mode data xfers
  309.                   NSPROTO_SPX);      // SPX = Connection Oriented
  310.  
  311.     if(sock == INVALID_SOCKET) {
  312.         SetDlgItemText(hdlg, CD_STATUS, "ERROR on socket()");
  313.         WSACleanup();
  314.         return TRUE;
  315.     }
  316.  
  317.     SetDlgItemText(hdlg, CD_STATUS, "socket() Succeeded");
  318.  
  319.     SetDlgItemText(hdlg, CD_STATUS, "Calling connect()");
  320.  
  321.     // Call specified address (we block here since I don't have anything better
  322.     // to do).
  323.     if(connect(sock, (struct sockaddr *)&RemAddr, sizeof(RemAddr)) == SOCKET_ERROR)
  324.     {
  325.         // Failed!  Post status and cleanup
  326.         sprintf(outtext, "connect() failed, error %u", WSAGetLastError());
  327.         SetDlgItemText(hdlg, CD_STATUS, outtext);
  328.         closesocket(sock);
  329.         WSACleanup();
  330.         return TRUE;
  331.     }
  332.  
  333.     // We've got a connection!  Kill the dialog
  334.     SetDlgItemText(hdlg, CD_STATUS, "connect() succeeded!");
  335.  
  336.     EndDialog(hdlg, TRUE);          // Exit the dialog
  337.     DeleteObject (hfontDlg);
  338.     return (TRUE);
  339. }
  340.