Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Winsock ja Threadit

kayttaja-3842 [30.05.2007 17:23:36]

#

Juu elikkäs. Itse olen tekemässä omaa kevyttä konsolipohjaista tiedon siirto ohjelmaa. Ainut ongelmani tällä hetkellä on että miten toteuttaa multi user yhteys. Eli monen käyttäjän tukeva serveri. Itse netisä luettuani sain selville, että kannattaa käyttää Threadeja, koska sen avulla pystyy samanaikasesti tutkimaan onko uusia käyttäjiä jotka haluisivat yhdistää, sekä pystyy sillä aikaa pitää toiminassa esim. keskustelujen/tiedostojen lähettelyä. Eli miten tämä tulisi toteuttaa? Pitääkö minun luoda esim 100 hengen serverille eka 100 socketin taulukko? Sitten sitä rataa ottaa käyttöön vai? Sekä mikä olisi hyvä ja helppo Threadi kirjasto. Kielenä toimii siis C/C++

Deffi [31.05.2007 14:10:43]

#

Säie (thread) luodaan CreateThread API:lla. Itse en tätä tapaa suosittelisi, syö paljon tehoja ja on helpompikin tapa olemassa: select(), jolla voidaan katsoa onko dataa tulemassa tai onko joku yhdistämässä. Linkin takaa löytyy myös mukava koodiesimerkki, miten tuollainen "multi-user" -juttu tapahtuu.

kayttaja-3842 [01.06.2007 17:26:07]

#

Kiitos paljon Deffi.

kayttaja-3842 [01.06.2007 19:00:41]

#

Tuota, voisiko joku kumminki vielä vähän autella?

Eli tässä olisi tällänen oma väsäämäni testi, mutta ongelma on siinä, että en tiedä miten tuota selectiä pitäisi käyttää tässä minun koodissani?

Eli nytten tuo ohjelma tekeen vain sen, että se tarkitaa niin pitkää yhteyksiä kunnes joku yhdistää ja sen jälkeen vasta ottaa viestit. Eli miten selectiä tulisi käyttää, että saisin tämän toiminnon toimimaan yhtäaikaan?

#include <unistd.h>
#include <sys/types.h>
#include <winsock2.h>
#include <iostream>

using namespace std;

struct CLIENTIT{
	SOCKET csocketti;
	struct sockaddr_in caddr;
};

struct sockaddr_in stieto;

CLIENTIT Clientti[4];

int alusta_serveri();
int tarkista_yhteydet();
int otadata();

int yhteyksia = 0;
int maxyhteydet = 3;
SOCKET socketti;
bool a = false;

int main(){

alusta_serveri();
while(!a){
cout << "Tarkisut..." << endl;
 tarkista_yhteydet();
 otadata();
}

system("PAUSE");
return 0;
}


int alusta_serveri(){
 WSADATA wsadata;
 char *data;
 int data_koko;

 if(WSAStartup(MAKEWORD(2,0),&wsadata) == SOCKET_ERROR){

cout << "WSAStratup virhe!";

}

if((socketti = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0){
cout << "Socketti virhe";
}

memset (&stieto,0,sizeof(stieto));
stieto.sin_family = AF_INET;
stieto.sin_port = htons(8888);
stieto.sin_addr.s_addr = inet_addr("127.0.0.1");

if( bind(socketti,(struct sockaddr *)&stieto,sizeof(stieto)) < 0){
cout << "Bindaus virhe!";
}

if(listen(socketti,SOMAXCONN) < 0){
   cout << "Kuuntelu virhe!";
}


    }



int tarkista_yhteydet(){
int pituus;

pituus = sizeof(stieto);
if(yhteyksia < maxyhteydet){
cout << "Odotellaan..." << endl;
if( (Clientti[yhteyksia].csocketti = accept(socketti,(struct sockaddr *)&Clientti[yhteyksia].caddr,&pituus)) < 0){
cout << "Accept virhe!";
}else{
cout << "Joku yhdisti!";
yhteyksia++;
}
}

}


int otadata(){

	int ndata;
	char data[1024];

	ndata = recv(Clientti[yhteyksia].csocketti, data, sizeof(data), 0);
	char *asiakasip = inet_ntoa(Clientti[yhteyksia].caddr.sin_addr);

	if (ndata == 0) {
	cout << "Yhteys Clienttiin on katkennut.";
	}
	else {
		cout << "<" << asiakasip << "> ";
		data[ndata] = '\0';
		cout << data;
		cout << "\n";

	}

}

KOITAKAA SAADA SELVÄÄ, EN TÄHÄN HÄTÄÄN OIKEIN KEKSINYT ETTÄ MITÄ KOMMENTTEJA TUONNE NYT HEITTELISI :P

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta