Thread Server

partitionist

Erfahrenes Mitglied
Damit ich eine Verbindung mit mehreren clients an ein server aufbauen kann, muss der server mit threads laufen, könnt ihr mir an diesem beispiel zeigen was ich machen soll:

Code:
SOCKET theSocket;
 
 	theSocket = socket(AF_INET,		// Address family
     		    	   SOCK_DGRAM,  // Socket type
     		    	   IPPROTO_UDP);// Protocol
 	if (theSocket == INVALID_SOCKET)
 	{
 		PRINTERROR("socket()");
 		return;
 	}
 	
 	//
 	// Fill in the address structure
 	//
 	SOCKADDR_IN saServer;
 
 	saServer.sin_family = AF_INET;
 	saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock assign address
 	saServer.sin_port = htons(nPort);	   // Use port passed from user
 
 
 	//
 	// bind the name to the socket
 	//
 	int nRet;
 
     nRet = bind(theSocket,	    		// Socket descriptor
     		    (LPSOCKADDR)&saServer,  // Address to bind to
 			sizeof(struct sockaddr)	// Size of address
 				);
 	if (nRet == SOCKET_ERROR)
 	{
 		PRINTERROR("bind()");
 		closesocket(theSocket);
 		return;
 	}
 
 
 	//
 	// This isn't normally done or required, but in this 
 	// example we're printing out where the server is waiting
 	// so that you can connect the example client.
 	//
 	int nLen;
 	nLen = sizeof(SOCKADDR);
 	char szBuf[256];
 
 	nRet = gethostname(szBuf, sizeof(szBuf));
 	if (nRet == SOCKET_ERROR)
 	{
 		PRINTERROR("gethostname()");
 		closesocket(theSocket);
 		return;
 	}
 
 	//
 	// Show the server name and port number
 	//
 	printf("\nServer named %s waiting on port %d\n",
 			szBuf, nPort);
 			
 
 	//
 	// Wait for data from the client
 	//
 	SOCKADDR_IN saClient;
 
 	memset(szBuf, 0, sizeof(szBuf));
     nRet = recvfrom(theSocket,	    		// Bound socket
 		 	szBuf,	 			// Receive buffer
 		 		sizeof(szBuf), 		// Size of buffer in bytes
 		 	0,	 		 	// Flags
 	 		 (LPSOCKADDR)&saClient,	// Buffer to receive client address 
 	 		 &nLen);		 		// Length of client address buffer
 
Jo können wir ;)

Code:
//Thread Handle.
HANDLE hThread;

//Thread erstellen.
hThread = CreateThread(
			NULL,
			0, 
			recvThread, //Funktion
			(LPVOID)0, 
			CREATE_SUSPENDED, 
			&dwThreadID 
			);


//Funktion die vom Thread aufgerufen wird.
DWORD WINAPI recvThread(LPVOID data)
{
	while(1)
	{
		//Hier kannst du dein recvfrom hinmachen ;)
	}
	return((DWORD)data); 
}

CloseHandle(hThread); //Nicht vergessen.

Jetzt startest du den Thread mit :
Code:
ResumeThread(hThread);

Und anhalten mit :
Code:
SuspendThread(hThread);


Viel spaß ;)




Gruß KHORN
 
hmm übrigens muss ein Server nicht mehrere Threads öffnen damit sich mehrere Clients gleichzeitig mit ihm verbinden können.
Bei einem einfachen Server kannst du auch mehrere Socketverbindungen in einem einzigen Thread öffnen und diese sequentiell bearbeiten ...
 
partitionist hat gesagt.:
Wie baue ich das in mein beispiel ein, wird für jede neue verbindung ein neuer socket erstellt?

Ja. Jede neue Verbindung erhält eine neue Socket-ID, anhand der du jede Verbindung unterscheiden kannst. Schließt du einen Socket, wird die ID evtl. für den nächsten gleich wieder vergeben (darauf hast du aber keinen Einfluss). Allerdings gibt es dabei ein betriebssystemabhängiges Maximum an maximal gleichzeitig offenen Sockets.

Vielleicht hilfreich:
http://www.zotteljedi.de/doc/socket-tipps/index.html
 
Zurück