Listing 2: NETWORK.C Winsock support functions


/**********************************************************/
/* NETWORK.C - Winsock support functions                  */
/**********************************************************/
#include "popmail.rh"
#include "winsock.h"
#include "globals.h"
extern WSADATA WSAData;
extern HWND hwndClient;
extern stConfig Config;
extern char HostInfo[MAXGETHOSTSTRUCT];
HANDLE TaskHandle;
BOOL InitNetwork(void)
  {
	  char work_buffer[60];
	  Display("Attempting to initialize winsock layer...\r\n");
	  if (WSAStartup(0x101, &WSAData)) return FALSE;
	  if ((((int) LOBYTE(WSAData.wVersion) > 1) &&
		 ((int) HIBYTE(WSAData.wVersion > 1)) &&
			(((int) LOBYTE(WSAData.wHighVersion) < 1) &&
			  ((int) HIBYTE(WSAData.wHighVersion) < 1))))
				 return FALSE;
	  sprintf(work_buffer, "PopMail Detected: %s\r\n", WSAData.szDescription);
	  Display(work_buffer);
	  sprintf(work_buffer, "Maximum Sockets : %d\r\n", WSAData.iMaxSockets);
	  Display(work_buffer);
	  return TRUE;
  }
void ShutDownNetwork(void)
  {
	  Display("Shutting down winsock layer...\r\n");
	  WSACleanup();
  }
void LookupServer(HWND hwnd)
  {
	  char work_buffer[100];
	  sprintf(work_buffer, "Looking Up  : %s\r\n", Config.ServerName);
	  Display(work_buffer);
	  TaskHandle = WSAAsyncGetHostByName(hwnd, IMSG_HOSTFOUND, Config.ServerName, HostInfo, MAXGETHOSTSTRUCT);
  }
void ConnectToServer(HWND hwnd)
  {
	  int nError;
	  SOCKET Socket;
	  SOCKADDR_IN LocalAddr, ServerAddr;
	  Display("Connecting to server.\r\n");
	  Socket = socket(AF_INET, SOCK_STREAM, 0);
	  if (Socket != INVALID_SOCKET)
		 {
			LocalAddr.sin_family = AF_INET;
			LocalAddr.sin_port = 0; /* winsock will assign a local port number */
			LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
			Display("Binding local socket.\r\n");
			if (bind(Socket, (LPSOCKADDR)&LocalAddr, sizeof(LocalAddr)) != SOCKET_ERROR)
			  {
				  ServerAddr.sin_family = AF_INET;
				  ServerAddr.sin_port = htons(POP3_PORT);
				  ServerAddr.sin_addr.s_addr = inet_addr(Config.ServerIp);
				  Display("Selecting relevant network events.\r\n");
				  if (WSAAsyncSelect(Socket, hwnd, IMSG_NETIO, FD_CONNECT | FD_READ | FD_CLOSE) != SOCKET_ERROR)
					 {
						 Display("Requesting stream socket connection to server's POP port.\r\n");
						 if (connect(Socket, (LPSOCKADDR)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR)
							{
								nError = WSAGetLastError();
								if (nError != WSAEWOULDBLOCK)
								  Display("Error connecting bound socket to server!");
							}
					 } else Display("Error setting up WSAAsyncSelect on bound socket!");
			  } else Display("Error binding socket to address.r\n");
		 } else Display("Error creating outbound socket.\r\n");
  }