Klient - Serwer kilka polaczen na raz

Klient - Serwer kilka polaczen na raz
DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
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

Kopiuj
 #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

Kopiuj
 #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()
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

wątki

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
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ę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.