| | |
Help with multithread server
Please support our C advertiser: Programming Forums - DaniWeb Sister Site
![]() |
•
•
Join Date: Apr 2005
Posts: 1
Reputation:
Solved Threads: 0
This is an assignment where the server uses a socket to communicate with a web browser however it has to be multi threaded but I am not sure on how to add code for the threads, i have attempted it but got no where.
thanks.
<< moderator edit: added [code][/code] tags >>
thanks.
C Syntax (Toggle Plain Text)
/******************************************************************** * Systems Programming (COMU311) * * * * StreamServer: * * Creates a Stream Socket and displays any information sent by * * a client application. * * * * * * Brian Hainey, Glasgow Caledonian University * ********************************************************************/ #include <windows.h> #include <iostream> #include <assert.h> #include <winsock.h> #include "Assignment2Util.h" using namespace std; #define BUFF_SIZE 4096 #define SERVER_PORT 8080 /* The servers port, clients will use this */ //***************************************************************** //add a prototype for the thread function to be used by all threads //***************************************************************** DWORD WINAPI SPThreadFunction(LPVOID lpParam); void main() { cout << "Server process running" << endl; //******************************** //Initialise the Sockets Library //version 1.1 is all that's needed //******************************** WSADATA wsaData; WORD wVersionRequired = MAKEWORD(1, 1); int nWSStatus = WSAStartup( wVersionRequired, &wsaData ); assert(nWSStatus == 0); //********************************************************* //create a Stream Socket that will listen for connections //********************************************************* SOCKET listeningSocket = socket(AF_INET, SOCK_STREAM, 0); assert(listeningSocket != INVALID_SOCKET); //********************************************************* //bind so that we have a connection point i.e. IP plus port //use port SERVER_PORT and assign any valid IP address //********************************************************* SOCKADDR_IN serverAddress; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(SERVER_PORT); serverAddress.sin_addr.s_addr = INADDR_ANY; nWSStatus = bind( listeningSocket, (SOCKADDR*) &serverAddress, sizeof(serverAddress)); assert (nWSStatus != SOCKET_ERROR); //********************************************************* //place socket in state where it can listen for connections //********************************************************* nWSStatus = listen(listeningSocket, SOMAXCONN); assert(nWSStatus != SOCKET_ERROR); //************************************************************ //accept any connection, will block until a connection is made //************************************************************ SOCKADDR_IN clientAddress; //will hold the address details of the client //who has connected to this socket int clientAddressLength = sizeof(clientAddress); SOCKET communicationSocket = accept( listeningSocket, (SOCKADDR*) &clientAddress, &clientAddressLength); assert(communicationSocket != INVALID_SOCKET); //************************************************ //declare variables to hold the ids of two threads //and their handles //************************************************ DWORD dwMyThreadId1; HANDLE hMyThread1; int myInt1 = 2001; //********************************************************************** //indicate, on the console, that the two threads are about to be created //and wait for the key entry before continuing //********************************************************************** cout << "About to create threads." << endl; //********************** //create the two threads //********************** hMyThread1 = CreateThread( NULL, // security attributes 0, // use default stack size SPThreadFunction, // pointer to thread function &myInt1, // pointer to thread function parameter 0, // use default creation flags &dwMyThreadId1 // pointer to returned thread identifier ); assert(hMyThread1 != NULL); //************************************* //Read a single message from the client //and display it //************************************* char messageData[500]; nWSStatus = recv( communicationSocket, messageData, sizeof(messageData), 0); assert(nWSStatus != SOCKET_ERROR); cout << "The message is : " << messageData << endl; char pathname[256]; int pathsize = 256; bool validrequest = ParseHttpRequest(messageData,pathname, &pathsize); int bufferSize; //char messageBody; int bodySize = 256; char * pResponse; //pResponse = CreateHttpResponse(NOT_IMPLEMENTED_STATUS, &bufferSize, NULL, 0); if(validrequest == false){ pResponse = CreateHttpResponse(NOT_IMPLEMENTED_STATUS, &bufferSize, NULL, 0); cout << pResponse << endl; } //cout << "response is" << pResponse << endl; //cout << " size of presponse is" << sizeof(pResponse) << endl; //cout << "pathname of the GET command is " << pathname << endl; if(validrequest == true){ //ADDRESS******************** char absoloutePathname [256]; sprintf(absoloutePathname, "C:/Students/%s", pathname); cout << absoloutePathname << endl; //************************************ //open the file called comu311demo.txt //It must be possible to read the file //************************************ HANDLE hRequiredFile = CreateFile( absoloutePathname, //the file name GENERIC_READ, // open for reading 0, // no sharing NULL, // no security OPEN_EXISTING, // open file, fail if does not exist FILE_ATTRIBUTE_NORMAL, // no special attributes NULL); // no template file if (hRequiredFile == INVALID_HANDLE_VALUE) pResponse = CreateHttpResponse(NOT_FOUND_STATUS, &bufferSize, NULL, 0); cout << pResponse << endl; //cout << "File doesnt exsist" << endl; ///************************************** //read all the information from the file //************************************** char pstrBuffer[BUFF_SIZE]; DWORD dwNumberOfBytesRead; ReadFile( hRequiredFile, pstrBuffer, BUFF_SIZE, &dwNumberOfBytesRead, NULL); pResponse = CreateHttpResponse(OK_STATUS, &bufferSize, pstrBuffer, dwNumberOfBytesRead); cout << pResponse << endl; //************** //close the file //************** BOOL bCloseStatus = CloseHandle(hRequiredFile); assert(bCloseStatus != 0); }//END OF IF************** //SEND RESPONSE BACK*********** nWSStatus = send( communicationSocket, pResponse, bufferSize, 0); assert(nWSStatus != SOCKET_ERROR); //****************************************************** //close the communication socket, it is no longer needed //****************************************************** closesocket(communicationSocket); //************************************************** //close the listening socket, it is no longer needed //************************************************** closesocket(listeningSocket); char temp; cin >> temp; DWORD WINAPI SPThreadFunction(LPVOID lpParam) { MessageBox(NULL, "Systems Programming Thread", "Systems Programming", MB_OK); return 0; } //**************************** //Terminate use of Sockets Lib //**************************** WSACleanup(); cout << "Done" << endl; } //end of main
![]() |
Similar Threads
- Novell Netware Server Specs (Geeks' Lounge)
- SQL Server vs MYSQL vs MSQL (i'm stopping now) (MS SQL)
- ASP slow-down server script (ASP)
- laptop and server (IT Professionals' Lounge)
Other Threads in the C Forum
- Previous Thread: Made my own vector thingy
- Next Thread: Need someone create this source code
| Thread Tools | Search this Thread |
#include adobe api array arrays asterisks binarysearch calculate char cm copyanyfile copyimagefile copypdffile cprogramme createcopyoffile createprocess() csyntax directory dynamic feet fflush fgets file fork forloop framework frequency getlasterror givemetehcodez global graphics gtkgcurlcompiling hacking hardware highest homework i/o incrementoperators kernel kilometer km linked linkedlist linux linuxsegmentationfault list lists locate logical_drives loopinsideloop. match matrix meter microsoft motherboard mqqueue multi mysql number odf open opensource openwebfoundation owf pattern pdf performance pointer pointers posix probleminc process program programming pyramidusingturboccodes read recursion recv repetition research scanf scheduling scripting segmentationfault send shape socket socketprograming stack standard string strings systemcall testautomation unix user voidmain() wab win32api windows.h





