CONNECT.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:10k
源码类别:

Windows编程

开发平台:

Visual C++

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