Frage zu TCP /c++

11/30/2013 15:11 Terrat#1
Hallo liebe Epvp Community,

ich befasse mich seit neusten mit TCP Techniken. Alles schön und gut klappt auch alles solange es nur 1 Client gibt. Nun möchte ich multiclients einführen sprich immer wen die while durchläuft die Clients die schon connected sind etwas zuschicken mit "send();". Das würde auch klappen/klappt auch schon doch das Problem ist das ich mit "accept();" die Clients rein lasse beim Server, accept(); wartet aber auf den Client das heißt die While schleife bleibt an diesen Punkt stehen bis ein neuer Client connected ist. Gibt es eine andere Möglichkeit(en) Clients (reinzulassen) ohne accept(); zu nutzen oder wen dieses Unterbrechen zu verhindern. Wer das noch wissen will ,in der While schleife sind keine sleeps.
11/30/2013 15:20 Logtetsch#2
Du könntest für jeden Client einen eigenen Thread machen.
11/30/2013 15:32 MrSm!th#3
Quote:
Originally Posted by Logtetsch View Post
Du könntest für jeden Client einen eigenen Thread machen.
Sollte er aber nicht.
Sieh dir mal select an.
11/30/2013 16:27 Terrat#4
Danke mr.smith du meinst bestimmt das hier wen ich mich nicht irre?
[Only registered and activated users can see links. Click Here To Register...]

doch irgendwie kriege ich das nicht verbindet könntest du mir ein Beispiel dafür machen ?

Hier mal meine jetzige While schleife:
Code:
While(true)
{
			memset(&sendbuf, 0, sizeof(sendbuf));
			Client = accept(slisten,(struct sockaddr*)&Clientinfo,&Clientinfolen);
		    if(Client != SOCKET_ERROR)
				cout << "Client accepted: " << inet_ntoa(Clientinfo.sin_addr) <<" On Port: "
				     << ntohs(Clientinfo.sin_port) << endl;
			res = send(Client, "Welcome in Newtwork",strlen("Succesfull connected to Server!"),0);
			if( res != SOCKET_ERROR )
				cout << "Message Succesfull sendet to Client: " << inet_ntoa(Clientinfo.sin_addr) <<" On Port: "
				     << ntohs(Clientinfo.sin_port) << endl;
			else 
				cout << "Failed to send Message Reason:" << WSAGetLastError <<endl;
			cin.getline(sendbuf,256);
			res = send(Client, sendbuf ,strlen("Succesfull connected to Server!"),0);
			if( res != SOCKET_ERROR )
				cout << "Message Succesfull sendet to Client: " << inet_ntoa(Clientinfo.sin_addr) <<" On Port: "
				     << ntohs(Clientinfo.sin_port) << endl;
			else 
				cout << "Failed to send Message Reason:" << WSAGetLastError <<endl;
			for(int i=0; i < MAX_CLIENTS; i++)
			{
				if( CLIENT_HANDLE[i] != 0 )
				{
					cout << "Clienthandle "<< i << ": " <<CLIENT_HANDLE[i] << endl;
				}
			}
}
11/30/2013 17:40 K1ramoX#5
mach accept in einer schleife und speicher die sockets in einem vector ab. dann einen neuen thread erstellen, dort durch den vector durchiterieren und da dann die jeweilige nachricht absenden (sofern du eine nachricht für alle clienten haben willst, ansonsten nimm std::pair).

was ich dir aber mehr empfehlen würde, wär boost::asio. wird [Only registered and activated users can see links. Click Here To Register...] schön erklärt :D
11/30/2013 21:12 +Yazzn#6
Quote:
Originally Posted by Dreamsläps View Post
TCP Techniken ... send(); ... accept();
Bitte lies dir die beiden Artikel durch:
Transmission Control Protocol (TCP)
Winsock API

Quote:
Originally Posted by K1ramoX View Post
was ich dir aber mehr empfehlen würde, wär boost::asio. wird [Only registered and activated users can see links. Click Here To Register...] schön erklärt :D
boost.asio kann ziemlich komplex werden. Wenn man da noch nicht mal mit dem Standard Interface umgehen kann sehe ich da schwarz. Aber an sich ist boost.asio eine nette Sache.

Quote:
Originally Posted by K1ramoX View Post
std::pair
[noparse]std::pair[/noparse] :D