WinSock, znovu otevreni socketu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

WinSock, znovu otevreni socketu – C / C++ – Fórum – Programujte.comWinSock, znovu otevreni socketu – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
_Radek_
~ Anonymní uživatel
88 příspěvků
20. 2. 2011   #1
-
0
-

Zdravim,

chtel bych se zeptat jak presne funguji sockety ? Jde o to, ze programuji jednoduchy chatovaci program (pouzivam jednoduche blokovaci sockety, nebo jak se jim rika).
Jedna aplikace je server a druha klient. Pokud otevru obe aplikace, vse funguje jak ma, muzu posilat zpravy atd. Problem nastane pokud zavru klienta. Pokud ho znova otevru, jiz se k serveru nepripoji.
Jde mi vlastne o to, pokud zavru klienta, abych take nemusel restartovat server.

Tady je kousek pseudokodu ze zdrojaku serveru:



//Inicializace WSA...

SOCKET Socket;
while(true)
{
// Vytvoreni socketu pomoci funkce socket

SOCKADDR_IN SockAddr;
// Nastaveni struktury SockAddr
// Bind socketu na port a zavolani funkce listen(...)

// Nejaky dalsi kod, posilani zprav atd

// Klient poslal zpravu, ze byl ukoncen:
cout << "Pockat na dalsi pripojeni nebo ukoncit program ? (y/n)" << endl;
char ans[2];
cin.getline(ans, 2);
if(strcmp(ans, "y")) // pokud ano, opakovat smycku while(true)
break;
closesocket(Socket);
}


Pri pokusu o opetovne vytvoreni socketu a zavolani funcek bind(...) hlasi chybu, ze port je jiz pouzivan. Co s tim ?

Predem diky za jakoukoliv radu

Nahlásit jako SPAM
IP: 91.187.60.–
Reklama
Reklama
nervak0
Věrný člen
20. 2. 2011   #2
-
0
-

To co přijímá klienta je accept, jen ten opakuj.

socket()      // vytvoreni

bind() // prirazeni adresy
listen() // prijem prichozich spojeni
while (!konec)
accept() // prijeti jednoho klienta z fronty
A asi bude žádoucí aby komunikace s jedním klientem neblokovala přijímání dalších klientů.

Nahlásit jako SPAM
IP: 213.211.51.–
CZechBoY+4
Věrný člen
21. 2. 2011   #3
-
0
-

C++ nemá nějaký metody asynchronní? to je docela smůla v tom případě, bdueš moct komunikovat v jednu chvíli jen s jednim klientem :D (takže určitě existuje)
když přijde zpráva o ukončení klienta tak koho to zajmá? nebudu kvůli tomu snad vypínat server, ten musí bejt pořád zaplej, nech tam ten while(true) aby to četlo pořád data od klientů

Nahlásit jako SPAM
IP: 213.192.10.–
nervak0
Věrný člen
22. 2. 2011   #4
-
0
-

C++ nemá nějaký metody asynchronní?

C/C++ především sockety vůbec neřeší. WinSock metody pro asynchronní I/O má.

to je docela smůla v tom případě, bdueš moct komunikovat v jednu chvíli jen s jednim klientem

I bez nich můžeš obsluhovat více klientů současně.

když přijde zpráva o ukončení klienta tak koho to zajmá?

Každého slušného programátora. Tebe zajímat nemusí.

nebudu kvůli tomu snad vypínat server

Říkal snad někdo něco takového? Jasně, že ne. Pokud to není součástí aplikační logiky.

ten musí bejt pořád zaplej

Nemusí.

nech tam ten while(true) aby to četlo pořád data od klientů

V tom problém není. Další nesmyslná poznámka.

Já vím, že pokušení k popichování se těžko odolává, ale ty nejsi v pozici, aby sis to mohl dovolit.

Nahlásit jako SPAM
IP: 213.211.51.–
CZechBoY+4
Věrný člen
23. 2. 2011   #5
-
0
-

tak tam dej znova socket=socket(parametry) a bind... co to udělá?

já tu nepopichuju, jen se ptám

hele jak se teda obsluhuje víc klientů najednou když ne Async funkcí?

Nahlásit jako SPAM
IP: 213.192.10.–
KIIV+42
God of flame
23. 2. 2011   #6
-
0
-

To CZechBoY : kdyz nepouzivas asynchronni funkce mas jeste thready a nebo fork ... fork dela kopii celyho procesu a musis jen rozdelit co ma delat parent a co child...
thready sou v ramci stejneho procesu, akorat uz musis hlidat soubeh..

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 115 hostů

Podobná vlákna

Bezpečnost socketu — založil exilim

WinSock — založil LJ1024

Winsock v WinForm — založil seldik

Winsock a NAT — založil blackman.ce

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý