Musisz do zrobic na 'watkach' tzn kazdemu nowemu klientowi serwer bedzie przydzielal nowe gniazdo, dzieki temu naraz bedzie moglo sie polaczyc z serwerem kilkanascie osob. W watku pisze sie instrukcje, operacje ogolne dla klienta.
Tu masz kodzik serwerka opartego na watku (przeanalizuj go sobie)
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 447
#define DEFAULT_BUFFER 4096
//wątek do komunikacji z klientem
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET sock = (SOCKET)lpParam;
char szBuf[DEFAULT_BUFFER];
while(1)
{
/tutaj sobie piszesz co ma robic po polaczeniu klienta... czyli odbieranie, przetwarzanie pakietow itd.../
}
return 0;
}
int main()
{
WSADATA wsd;
SOCKET sListen,
sClient;
int iAddrSize;
HANDLE hThread;
DWORD dwThreadID;
struct sockaddr_in local, client;
struct hostent *host = NULL;
// inicjuj Winsock 2.2
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("Bladd ladowania Winsock 2.2!\n");
return 1;
}
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sListen == SOCKET_ERROR)
{
printf("Blad funkcji socket(): %d\n", WSAGetLastError());
return 1;
}
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(DEFAULT_PORT);
if (bind(sListen, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
{
printf("Blad funkcji bind(): %d\n", WSAGetLastError());
return 1;
}
host = gethostbyname("localhost");
if (host == NULL)
{
printf("Nie udalo sie wydobyc nazwy serwera\n");
return 1;
}
listen(sListen, 8);
printf("SERWER NASLUCHUJE\n");
printf("Adres: %s, port: %d\n", host->h_name, DEFAULT_PORT);
/* tutaj akceptuje nadchodzace polaczenia i kazdemu polaczeniowi przydziela nowe gniazdo i wykonywane sa operacje w watku...*/
while (1)
{
iAddrSize = sizeof(client);
sClient = accept(sListen, (struct sockaddr *)&client, &iAddrSize);
if (sClient == INVALID_SOCKET)
{
printf("Blad funkcji accept(): %d\n", WSAGetLastError());
return 1;
}
printf("Zaakceptowano polaczenie: serwer %s, port %d\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
//tutaj jest tworzony watek dla nowego polaczenia
hThread = CreateThread(NULL, 0, ClientThread,
(LPVOID)sClient, 0, &dwThreadID);
if (hThread == NULL)
{
printf("Blad funkcji CreateThread(): %d\n", WSAGetLastError());
return 1;
}
CloseHandle(hThread);
}
closesocket(sListen);
WSACleanup();
return 0;
}
Kodzik powinien byc poprawny - skopiowalem go z mojego starego kodu zrodlowego, niechcialo mi sie go sprawdzac ale powinnien dzialac :):) pozdrawiam