- Set svn:eol-style to native
authorGed Murphy <gedmurphy@reactos.org>
Tue, 27 Sep 2005 23:37:05 +0000 (23:37 +0000)
committerGed Murphy <gedmurphy@reactos.org>
Tue, 27 Sep 2005 23:37:05 +0000 (23:37 +0000)
- Set svn:ignore on directories
Thanks to w3seek for pointing this out.

svn path=/trunk/; revision=18132

reactos/apps/utils/net/tcpsvcs/chargen/chargen.c
reactos/apps/utils/net/tcpsvcs/chargen/chargen.h
reactos/apps/utils/net/tcpsvcs/echo/echo.c
reactos/apps/utils/net/tcpsvcs/echo/echo.h
reactos/apps/utils/net/tcpsvcs/skelserver/skelserver.c
reactos/apps/utils/net/tcpsvcs/skelserver/skelserver.h
reactos/apps/utils/net/tcpsvcs/tcpsvcs.c
reactos/apps/utils/net/tcpsvcs/tcpsvcs.h

index 90b27a8..76b9714 100644 (file)
-#include <stdio.h>\r
-#include <winsock2.h>\r
-#include <tchar.h>\r
-#include "chargen.h"\r
-#include "../skelserver/skelserver.h"\r
-\r
-DWORD WINAPI ChargenHandler(VOID* Sock_)\r
-{\r
-    DWORD Retval = 0;\r
-    SOCKET Sock = (SOCKET)Sock_;\r
-\r
-    if (!GenerateChars(Sock)) {\r
-        _tprintf(_T("Echo incoming packets failed\n"));\r
-        Retval = 3;\r
-    }\r
-\r
-    _tprintf(_T("Shutting connection down...\n"));\r
-    if (ShutdownConnection(Sock)) {\r
-        _tprintf(_T("Connection is down.\n"));\r
-    }\r
-    else\r
-    {\r
-        _tprintf(_T("Connection shutdown failed\n"));\r
-        Retval = 3;\r
-    }\r
-\r
-    return Retval;\r
-}\r
-\r
-\r
-BOOL GenerateChars(SOCKET Sock)\r
-{\r
-    int i,\r
-        charIndex, /* internal loop */\r
-        loopIndex; /* line loop */\r
-    char ring[END-START];\r
-    char *endring;\r
-\r
-    /* fill ring with printable characters */\r
-    for (charIndex=0, i=START; i<=END; charIndex++, i++)\r
-        ring[charIndex] = i;\r
-    /* establish the end character in the ring */\r
-    endring = &ring[charIndex];\r
-\r
-    /* where we will start output from */\r
-    loopIndex = 0;\r
-\r
-    while (1)\r
-    {\r
-        /* if the loop index is equal to number of chars previously\r
-         * printed, start the loop from the beginning */\r
-        if (loopIndex == END-START)\r
-            loopIndex = 0;\r
-\r
-        /* start printing from char controled by loopIndex */\r
-        charIndex = loopIndex;\r
-        for (i=0; i<LINESIZ; i++)\r
-        {\r
-            SendChar(Sock, ring[charIndex]);\r
-            /* if current char equal last char, reset */\r
-            if (ring[charIndex] == *endring)\r
-                charIndex = 0;\r
-            else\r
-                charIndex++;\r
-        }\r
-        SendChar(Sock, L'\r');\r
-        SendChar(Sock, L'\n');\r
-\r
-        /* increment loop index to start printing from next char in ring */\r
-        loopIndex++;\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-BOOL SendChar(SOCKET Sock, TCHAR c)\r
-{\r
-    INT Temp;\r
-    INT SentBytes;\r
-\r
-    SentBytes = 0;\r
-    Temp = send(Sock, &c, sizeof(TCHAR), 0);\r
-    if (Temp > 0) {\r
-        SentBytes += Temp;\r
-    }\r
-    else if (Temp == SOCKET_ERROR) {\r
-        return FALSE;\r
-    }\r
-    else\r
-    {\r
-        /* Client closed connection before we could reply to\r
-           all the data it sent, so quit early. */\r
-        _tprintf(_T("Peer unexpectedly dropped connection!\n"));\r
-        return FALSE;\r
-    }\r
-\r
-    _tprintf(("Connection closed by peer.\n"));\r
-    return TRUE;\r
-}\r
-\r
-\r
-\r
-\r
-\r
+#include <stdio.h>
+#include <winsock2.h>
+#include <tchar.h>
+#include "chargen.h"
+#include "../skelserver/skelserver.h"
+
+DWORD WINAPI ChargenHandler(VOID* Sock_)
+{
+    DWORD Retval = 0;
+    SOCKET Sock = (SOCKET)Sock_;
+
+    if (!GenerateChars(Sock)) {
+        _tprintf(_T("Echo incoming packets failed\n"));
+        Retval = 3;
+    }
+
+    _tprintf(_T("Shutting connection down...\n"));
+    if (ShutdownConnection(Sock)) {
+        _tprintf(_T("Connection is down.\n"));
+    }
+    else
+    {
+        _tprintf(_T("Connection shutdown failed\n"));
+        Retval = 3;
+    }
+
+    return Retval;
+}
+
+
+BOOL GenerateChars(SOCKET Sock)
+{
+    int i,
+        charIndex, /* internal loop */
+        loopIndex; /* line loop */
+    char ring[END-START];
+    char *endring;
+
+    /* fill ring with printable characters */
+    for (charIndex=0, i=START; i<=END; charIndex++, i++)
+        ring[charIndex] = i;
+    /* establish the end character in the ring */
+    endring = &ring[charIndex];
+
+    /* where we will start output from */
+    loopIndex = 0;
+
+    while (1)
+    {
+        /* if the loop index is equal to number of chars previously
+         * printed, start the loop from the beginning */
+        if (loopIndex == END-START)
+            loopIndex = 0;
+
+        /* start printing from char controled by loopIndex */
+        charIndex = loopIndex;
+        for (i=0; i<LINESIZ; i++)
+        {
+            SendChar(Sock, ring[charIndex]);
+            /* if current char equal last char, reset */
+            if (ring[charIndex] == *endring)
+                charIndex = 0;
+            else
+                charIndex++;
+        }
+        SendChar(Sock, L'\r');
+        SendChar(Sock, L'\n');
+
+        /* increment loop index to start printing from next char in ring */
+        loopIndex++;
+    }
+
+    return 0;
+}
+
+BOOL SendChar(SOCKET Sock, TCHAR c)
+{
+    INT RetVal;
+    INT SentBytes;
+
+    SentBytes = 0;
+    RetVal = send(Sock, &c, sizeof(TCHAR), 0);
+    if (RetVal > 0) {
+        SentBytes += RetVal;
+    }
+    else if (RetVal == SOCKET_ERROR) {
+        return FALSE;
+    }
+    else
+    {
+        /* Client closed connection before we could reply to
+           all the data it sent, so quit early. */
+        _tprintf(_T("Peer unexpectedly dropped connection!\n"));
+        return FALSE;
+    }
+
+    _tprintf(("Connection closed by peer.\n"));
+    return TRUE;
+}
+
+
+
+
+
index 5155c55..2c31834 100644 (file)
@@ -1,8 +1,8 @@
-#define START 32\r
-#define END 126\r
-#define LINESIZ 72\r
-#define BUF 1024\r
-\r
-DWORD WINAPI ChargenHandler(VOID* Sock_);\r
-BOOL GenerateChars(SOCKET Sock);\r
-BOOL SendChar(SOCKET Sock, CHAR c);\r
+#define START 32
+#define END 126
+#define LINESIZ 72
+#define BUF 1024
+
+DWORD WINAPI ChargenHandler(VOID* Sock_);
+BOOL GenerateChars(SOCKET Sock);
+BOOL SendChar(SOCKET Sock, CHAR c);
index ef8f5b4..98929f8 100644 (file)
@@ -1,72 +1,71 @@
-#include <stdio.h>\r
-#include <winsock2.h>\r
-#include <tchar.h>\r
-#include "echo.h"\r
-#include "../skelserver/skelserver.h"\r
-\r
-// Handles the incoming data by reflecting it back to the sender.\r
-DWORD WINAPI EchoHandler(VOID* Sock_)\r
-{\r
-    DWORD Retval = 0;\r
-    SOCKET Sock = (SOCKET)Sock_;\r
-\r
-    if (!EchoIncomingPackets(Sock)) {\r
-        _tprintf(_T("Echo incoming packets failed\n"));\r
-        Retval = 3;\r
-    }\r
-\r
-    _tprintf(_T("Shutting connection down...\n"));\r
-    if (ShutdownConnection(Sock)) {\r
-        _tprintf(_T("Connection is down.\n"));\r
-    }\r
-    else\r
-    {\r
-        _tprintf(_T("Connection shutdown failed\n"));\r
-        Retval = 3;\r
-    }\r
-\r
-    return Retval;\r
-}\r
-\r
-\r
-\r
-BOOL EchoIncomingPackets(SOCKET Sock)\r
-{\r
-    TCHAR ReadBuffer[BUF];\r
-    INT Temp;\r
-    INT ReadBytes;\r
-    INT SentBytes;\r
-\r
-    do {\r
-        ReadBytes = recv(Sock, ReadBuffer, BUF, 0);\r
-        if (ReadBytes > 0) {\r
-            _tprintf(_T("Received %d bytes from client\n"), ReadBytes);\r
-\r
-            SentBytes = 0;\r
-            while (SentBytes < ReadBytes) {\r
-                Temp = send(Sock, ReadBuffer + SentBytes,\r
-                        ReadBytes - SentBytes, 0);\r
-                if (Temp > 0) {\r
-                    _tprintf(_T("Sent %d bytes back to client\n"), Temp);\r
-                    SentBytes += Temp;\r
-                }\r
-                else if (Temp == SOCKET_ERROR) {\r
-                    return FALSE;\r
-                }\r
-                else {\r
-                    /* Client closed connection before we could reply to\r
-                    // all the data it sent, so quit early. */\r
-                    _tprintf(_T("Peer unexpectedly dropped connection!\n"));\r
-                    return FALSE;\r
-                }\r
-            }\r
-        }\r
-        else if (ReadBytes == SOCKET_ERROR) {\r
-            return FALSE;\r
-        }\r
-    } while (ReadBytes != 0);\r
-\r
-    _tprintf(("Connection closed by peer.\n"));\r
-    return TRUE;\r
-}\r
-\r
+#include <stdio.h>
+#include <winsock2.h>
+#include <tchar.h>
+#include "echo.h"
+#include "../skelserver/skelserver.h"
+
+DWORD WINAPI EchoHandler(VOID* Sock_)
+{
+    DWORD Retval = 0;
+    SOCKET Sock = (SOCKET)Sock_;
+
+    if (!EchoIncomingPackets(Sock)) {
+        _tprintf(_T("Echo incoming packets failed\n"));
+        Retval = 3;
+    }
+
+    _tprintf(_T("Shutting connection down...\n"));
+    if (ShutdownConnection(Sock)) {
+        _tprintf(_T("Connection is down.\n"));
+    }
+    else
+    {
+        _tprintf(_T("Connection shutdown failed\n"));
+        Retval = 3;
+    }
+
+    return Retval;
+}
+
+
+
+BOOL EchoIncomingPackets(SOCKET Sock)
+{
+    TCHAR ReadBuffer[BUF];
+    INT Temp;
+    INT ReadBytes;
+    INT SentBytes;
+
+    do {
+        ReadBytes = recv(Sock, ReadBuffer, BUF, 0);
+        if (ReadBytes > 0) {
+            _tprintf(_T("Received %d bytes from client\n"), ReadBytes);
+
+            SentBytes = 0;
+            while (SentBytes < ReadBytes) {
+                Temp = send(Sock, ReadBuffer + SentBytes,
+                        ReadBytes - SentBytes, 0);
+                if (Temp > 0) {
+                    _tprintf(_T("Sent %d bytes back to client\n"), Temp);
+                    SentBytes += Temp;
+                }
+                else if (Temp == SOCKET_ERROR) {
+                    return FALSE;
+                }
+                else {
+                    /* Client closed connection before we could reply to
+                       all the data it sent, so quit early. */
+                    _tprintf(_T("Peer unexpectedly dropped connection!\n"));
+                    return FALSE;
+                }
+            }
+        }
+        else if (ReadBytes == SOCKET_ERROR) {
+            return FALSE;
+        }
+    } while (ReadBytes != 0);
+
+    _tprintf(("Connection closed by peer.\n"));
+    return TRUE;
+}
+
index 3f0d2a7..5c09b72 100644 (file)
@@ -1,4 +1,4 @@
-#define BUF 1024\r
-\r
-DWORD WINAPI EchoHandler(VOID* Sock_);\r
-BOOL EchoIncomingPackets(SOCKET Sock);\r
+#define BUF 1024
+
+DWORD WINAPI EchoHandler(VOID* Sock_);
+BOOL EchoIncomingPackets(SOCKET Sock);
index fa65f40..a70e044 100644 (file)
-#include <stdio.h>\r
-#include <winsock2.h>\r
-#include <tchar.h>\r
-#include "../tcpsvcs.h"\r
-#include "skelserver.h"\r
-\r
-\r
-DWORD WINAPI StartServer(LPVOID lpParam)\r
-{\r
-    const TCHAR* HostIP = "127.0.0.1";\r
-    DWORD RetVal;\r
-    WSADATA wsaData;\r
-    PMYDATA pData;\r
-\r
-    pData = (PMYDATA)lpParam;\r
-\r
-    if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)\r
-    {\r
-        _tprintf(_T("WSAStartup() failed : %lu\n"), RetVal);\r
-        return -1;\r
-    }\r
-\r
-    SOCKET ListeningSocket = SetUpListener(HostIP, htons(pData->Port));\r
-    if (ListeningSocket == INVALID_SOCKET)\r
-    {\r
-        _tprintf(_T("error setting up socket\n"));\r
-        return 3;\r
-    }\r
-\r
-    printf("Waiting for connections...\n");\r
-    while (1)\r
-    {\r
-        AcceptConnections(ListeningSocket, pData->Service);\r
-        printf("Acceptor restarting...\n");\r
-    }\r
-\r
-    WSACleanup();\r
-    return 0;\r
-}\r
-\r
-\r
-SOCKET SetUpListener(const char* ServAddr, int Port)\r
-{\r
-    SOCKET Sock;\r
-    SOCKADDR_IN Server;\r
-    DWORD InterfaceAddr = inet_addr(ServAddr);\r
-\r
-    if (InterfaceAddr != INADDR_NONE)\r
-    {\r
-        Sock = socket(AF_INET, SOCK_STREAM, 0);\r
-        if (Sock != INVALID_SOCKET)\r
-        {\r
-            Server.sin_family = AF_INET;\r
-            Server.sin_addr.s_addr = InterfaceAddr;\r
-            Server.sin_port = Port;\r
-            if (bind(Sock, (SOCKADDR*)&Server, sizeof(SOCKADDR_IN)) != SOCKET_ERROR)\r
-            {\r
-                listen(Sock, SOMAXCONN);\r
-                return Sock;\r
-            }\r
-            else\r
-                printf("bind() failed\n");\r
-\r
-        }\r
-    }\r
-    return INVALID_SOCKET;\r
-}\r
-\r
-\r
-\r
-\r
-VOID AcceptConnections(SOCKET ListeningSocket, LPTHREAD_START_ROUTINE Service)\r
-{\r
-    SOCKADDR_IN Client;\r
-    SOCKET Sock;\r
-    INT nAddrSize = sizeof(Client);\r
-    DWORD ThreadID;\r
-\r
-    while (1)\r
-    {\r
-        Sock = accept(ListeningSocket, (SOCKADDR*)&Client, &nAddrSize);\r
-        if (Sock != INVALID_SOCKET)\r
-        {\r
-            _tprintf(_T("Accepted connection from %s:%d\n"),\r
-                inet_ntoa(Client.sin_addr), ntohs(Client.sin_port));\r
-\r
-            CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID);\r
-        }\r
-        else\r
-        {\r
-            _tprintf(_T("accept() failed\n"));\r
-            return;\r
-        }\r
-    }\r
-}\r
-\r
-BOOL ShutdownConnection(SOCKET Sock)\r
-{\r
-    /* Disallow any further data sends.  This will tell the other side\r
-       that we want to go away now.  If we skip this step, we don't\r
-       shut the connection down nicely. */\r
-    if (shutdown(Sock, SD_SEND) == SOCKET_ERROR)\r
-        return FALSE;\r
-\r
-      /* Receive any extra data still sitting on the socket.  After all\r
-         data is received, this call will block until the remote host\r
-         acknowledges the TCP control packet sent by the shutdown above.\r
-         Then we'll get a 0 back from recv, signalling that the remote\r
-         host has closed its side of the connection. */\r
-    while (1)\r
-    {\r
-        char ReadBuffer[BUF];\r
-        int NewBytes = recv(Sock, ReadBuffer, BUF, 0);\r
-        if (NewBytes == SOCKET_ERROR)\r
-            return FALSE;\r
-        else if (NewBytes != 0)\r
-            _tprintf(_T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes);\r
-        else\r
-            break;\r
-    }\r
-\r
-    /* Close the socket. */\r
-    if (closesocket(Sock) == SOCKET_ERROR)\r
-        return FALSE;\r
-\r
-    return TRUE;\r
-}\r
+#include <stdio.h>
+#include <winsock2.h>
+#include <tchar.h>
+#include "../tcpsvcs.h"
+#include "skelserver.h"
+
+
+DWORD WINAPI StartServer(LPVOID lpParam)
+{
+    const TCHAR* HostIP = "127.0.0.1";
+    DWORD RetVal;
+    WSADATA wsaData;
+    PMYDATA pData;
+
+    pData = (PMYDATA)lpParam;
+
+    if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
+    {
+        _tprintf(_T("WSAStartup() failed : %lu\n"), RetVal);
+        return -1;
+    }
+
+    SOCKET ListeningSocket = SetUpListener(HostIP, htons(pData->Port));
+    if (ListeningSocket == INVALID_SOCKET)
+    {
+        _tprintf(_T("error setting up socket\n"));
+        return 3;
+    }
+
+    printf("Waiting for connections...\n");
+    while (1)
+    {
+        AcceptConnections(ListeningSocket, pData->Service);
+        printf("Acceptor restarting...\n");
+    }
+
+    WSACleanup();
+    return 0;
+}
+
+
+SOCKET SetUpListener(const char* ServAddr, int Port)
+{
+    SOCKET Sock;
+    SOCKADDR_IN Server;
+    DWORD InterfaceAddr = inet_addr(ServAddr);
+
+    if (InterfaceAddr != INADDR_NONE)
+    {
+        Sock = socket(AF_INET, SOCK_STREAM, 0);
+        if (Sock != INVALID_SOCKET)
+        {
+            Server.sin_family = AF_INET;
+            Server.sin_addr.s_addr = InterfaceAddr;
+            Server.sin_port = Port;
+            if (bind(Sock, (SOCKADDR*)&Server, sizeof(SOCKADDR_IN)) != SOCKET_ERROR)
+            {
+                listen(Sock, SOMAXCONN);
+                return Sock;
+            }
+            else
+                printf("bind() failed\n");
+
+        }
+    }
+    return INVALID_SOCKET;
+}
+
+
+
+
+VOID AcceptConnections(SOCKET ListeningSocket, LPTHREAD_START_ROUTINE Service)
+{
+    SOCKADDR_IN Client;
+    SOCKET Sock;
+    INT nAddrSize = sizeof(Client);
+    DWORD ThreadID;
+
+    while (1)
+    {
+        Sock = accept(ListeningSocket, (SOCKADDR*)&Client, &nAddrSize);
+        if (Sock != INVALID_SOCKET)
+        {
+            _tprintf(_T("Accepted connection from %s:%d\n"),
+                inet_ntoa(Client.sin_addr), ntohs(Client.sin_port));
+
+            CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID);
+        }
+        else
+        {
+            _tprintf(_T("accept() failed\n"));
+            return;
+        }
+    }
+}
+
+BOOL ShutdownConnection(SOCKET Sock)
+{
+    /* Disallow any further data sends.  This will tell the other side
+       that we want to go away now.  If we skip this step, we don't
+       shut the connection down nicely. */
+    if (shutdown(Sock, SD_SEND) == SOCKET_ERROR)
+        return FALSE;
+
+      /* Receive any extra data still sitting on the socket.  After all
+         data is received, this call will block until the remote host
+         acknowledges the TCP control packet sent by the shutdown above.
+         Then we'll get a 0 back from recv, signalling that the remote
+         host has closed its side of the connection. */
+    while (1)
+    {
+        char ReadBuffer[BUF];
+        int NewBytes = recv(Sock, ReadBuffer, BUF, 0);
+        if (NewBytes == SOCKET_ERROR)
+            return FALSE;
+        else if (NewBytes != 0)
+            _tprintf(_T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes);
+        else
+            break;
+    }
+
+    /* Close the socket. */
+    if (closesocket(Sock) == SOCKET_ERROR)
+        return FALSE;
+
+    return TRUE;
+}
index 21305dd..d9326da 100644 (file)
@@ -1,7 +1,7 @@
-#define BUF 1024\r
-\r
-DWORD WINAPI StartServer(LPVOID lpParam);\r
-SOCKET SetUpListener(const char* ServAddr, int Port);\r
-VOID AcceptConnections(SOCKET ListeningSocket, LPTHREAD_START_ROUTINE Service);\r
-BOOL EchoIncomingPackets(SOCKET sd);\r
-BOOL ShutdownConnection(SOCKET Sock);\r
+#define BUF 1024
+
+DWORD WINAPI StartServer(LPVOID lpParam);
+SOCKET SetUpListener(const char* ServAddr, int Port);
+VOID AcceptConnections(SOCKET ListeningSocket, LPTHREAD_START_ROUTINE Service);
+BOOL EchoIncomingPackets(SOCKET sd);
+BOOL ShutdownConnection(SOCKET Sock);
index 8628fb7..435a987 100644 (file)
@@ -1,57 +1,57 @@
-#include <stdio.h>\r
-#include <winsock2.h>\r
-#include <tchar.h>\r
-#include "tcpsvcs.h"\r
-#include "skelserver/skelserver.h"\r
-#include "echo/echo.h"\r
-#include "chargen/chargen.h"\r
-\r
-int main(int argc, char *argv[])\r
-{\r
-    PMYDATA pData[MAX_THREADS];\r
-    DWORD dwThreadId[MAX_THREADS];\r
-    HANDLE hThread[MAX_THREADS];\r
-    INT i;\r
-\r
-    /* Create MAX_THREADS worker threads. */\r
-    for( i=0; i<MAX_THREADS; i++ )\r
-    {\r
-        /* Allocate memory for thread data. */\r
-        pData[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));\r
-\r
-        if( pData == NULL )\r
-            ExitProcess(2);\r
-\r
-        /* Generate unique data for each thread. */\r
-        pData[0]->Port = ECHO_PORT;\r
-        pData[0]->Service = EchoHandler;\r
-        pData[1]->Port = CHARGEN_PORT;\r
-        pData[1]->Service = ChargenHandler;\r
-\r
-        hThread[i] = CreateThread(\r
-            NULL,              // default security attributes\r
-            0,                 // use default stack size\r
-            StartServer,       // thread function\r
-            pData[i],          // argument to thread function\r
-            0,                 // use default creation flags\r
-            &dwThreadId[i]);   // returns the thread identifier\r
-\r
-        /* Check the return value for success. */\r
-        if (hThread[i] == NULL)\r
-        {\r
-            ExitProcess(i);\r
-        }\r
-    }\r
-\r
-    /* Wait until all threads have terminated. */\r
-    WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);\r
-\r
-    /* Close all thread handles upon completion. */\r
-    for(i=0; i<MAX_THREADS; i++)\r
-    {\r
-        CloseHandle(hThread[i]);\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
+#include <stdio.h>
+#include <winsock2.h>
+#include <tchar.h>
+#include "tcpsvcs.h"
+#include "skelserver/skelserver.h"
+#include "echo/echo.h"
+#include "chargen/chargen.h"
+
+int main(int argc, char *argv[])
+{
+    PMYDATA pData[MAX_THREADS];
+    DWORD dwThreadId[MAX_THREADS];
+    HANDLE hThread[MAX_THREADS];
+    INT i;
+
+    /* Create MAX_THREADS worker threads. */
+    for( i=0; i<MAX_THREADS; i++ )
+    {
+        /* Allocate memory for thread data. */
+        pData[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));
+
+        if( pData == NULL )
+            ExitProcess(2);
+
+        /* Generate unique data for each thread. */
+        pData[0]->Port = ECHO_PORT;
+        pData[0]->Service = EchoHandler;
+        pData[1]->Port = CHARGEN_PORT;
+        pData[1]->Service = ChargenHandler;
+
+        hThread[i] = CreateThread(
+            NULL,              // default security attributes
+            0,                 // use default stack size
+            StartServer,       // thread function
+            pData[i],          // argument to thread function
+            0,                 // use default creation flags
+            &dwThreadId[i]);   // returns the thread identifier
+
+        /* Check the return value for success. */
+        if (hThread[i] == NULL)
+        {
+            ExitProcess(i);
+        }
+    }
+
+    /* Wait until all threads have terminated. */
+    WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);
+
+    /* Close all thread handles upon completion. */
+    for(i=0; i<MAX_THREADS; i++)
+    {
+        CloseHandle(hThread[i]);
+    }
+
+    return 0;
+}
+
index 97bfa60..8086868 100644 (file)
@@ -1,13 +1,13 @@
-#define ECHO_PORT 7\r
-#define CHARGEN_PORT 19\r
-#define DAYTIME_PORT 13\r
-#define DISCARD_PORT 9\r
-#define QOTD_PORT 17\r
-\r
-#define MAX_THREADS 2\r
-#define BUF_SIZE 255\r
-\r
-typedef struct _MyData {\r
-    INT Port;\r
-    LPTHREAD_START_ROUTINE Service;\r
-} MYDATA, *PMYDATA;\r
+#define ECHO_PORT 7
+#define CHARGEN_PORT 19
+#define DAYTIME_PORT 13
+#define DISCARD_PORT 9
+#define QOTD_PORT 17
+
+#define MAX_THREADS 2
+#define BUF_SIZE 255
+
+typedef struct _MyData {
+    INT Port;
+    LPTHREAD_START_ROUTINE Service;
+} MYDATA, *PMYDATA;