Klient - Serwer kilka polaczen na raz

0

Siema, zastanawiam sie jak zrobic zeby do serwera moglo podlaczyc sie pare klientow na raz. Probowalem to zrobic na tabelach ale nic mi nie wychodzilo. Druga sprawa to ze jak wylacze klienta i proboje sie poalczyc ponownie z serwerem to juz sie nie chce polaczyc. Poki co mam tak kod i nie wiem co z tym zrobic dalej =/ Pomoze ktos?

Client

 #include <winsock.h> 
#include <string> 
#include <iostream> 
#include <windows.h> 
#include <stdio.h> 
using namespace std;

WSADATA wsadata; 
struct hostent *serwer; 
SOCKET klient; 
SOCKADDR_IN adres;

int main() 
{
	
	WSAStartup(MAKEWORD(2,2), &wsadata); 
	klient = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

string adresip, wiadomosc; 
cout << "Polacz z: "; 
getline(cin, adresip); 
int PORT = 44777; 
int dziennik_bledow; 
adres.sin_family = AF_INET; 
adres.sin_port = htons(PORT); 
adres.sin_addr.s_addr = inet_addr(adresip.c_str());

dziennik_bledow = connect(klient, (struct sockaddr*)&adres, sizeof(adres)); 

while(1) 
{ 
    cout << "Podaj tresc wiadomosc jaka ma byc wyswietlona na serwerze: "; 
    getline(cin, wiadomosc); 
    dziennik_bledow = send(klient, wiadomosc.c_str(), wiadomosc.length(), 0); 
    if(dziennik_bledow == SOCKET_ERROR) 
cout << "\t\v\a Blad wysylania danych do serwera!" << endl; 
else cout << "\t\v Wyslano! " << endl; 
Sleep(10); 
} 
getchar();
}

Server

 #include <winsock.h> 
#include <string> 
#include <iostream> 
#include <windows.h>
#include<stdio.h> 
using namespace std;

WSADATA wsadata; 
SOCKET klient, nasluch; 
SOCKADDR_IN adres, adres_klienta; 
string tresc, wartosc; 
char wiadomosc[512];

int main()
{
	WSAStartup(MAKEWORD(2,2), &wsadata); 
nasluch = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); 
int PORT = 44777; 
int adres_dlugosc; 
adres.sin_family = AF_INET; 
adres.sin_port = htons(PORT); 
adres.sin_addr.s_addr = htonl(INADDR_ANY); 
bind(nasluch, (struct sockaddr*)&adres, sizeof(adres)); 
listen(nasluch, 10); 
adres_dlugosc = sizeof(adres_klienta); 
klient = accept(nasluch, (struct sockaddr*)&adres_klienta, &adres_dlugosc);


while(1) 
{ 
for(int i = 0 ; i < sizeof(wiadomosc) ; i++) 
{ 
char c[1] = ""; 
wiadomosc[i] = c[0]; 
} 
    recv(klient, wiadomosc, sizeof(wiadomosc), 0); 
tresc = wiadomosc; 
if(tresc != "") 

	cout << tresc << endl;

} 
    closesocket(klient); 
    WSACleanup(); 
} // koniec main()
0

wątki

0

Wątki to proste w wykonaniu ale ogółem dość niebezpieczne (szczególnie dla początkujących) rozwiązanie. Dużo bezpieczniej jest korzystać z jednego eventloopa i w sposób nieblokujący sprawdzać na którym sockecie się coś wydarzyło za pomocą funkcji select. Dzięki temu nie trzeba się martwić o synchronizację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1