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

Odezva serveru – C / C++ – Fórum – Programujte.comOdezva serveru – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Redby0
Návštěvník
22. 11. 2011   #1
-
0
-

Ahoj, řeším opět jednu záhadu. Mám tento fragment kodu:

			recv(sd_current, buffer, 1024, 0);

			printf("%s", buffer);
			int n = strncmp(buffer, "#LOGIN#", 7);
		
			if (n == 0){
				exit(0);
			}

			while (1) {

				if (recv(sd_current, buffer, 1024, 0) < 0) {
					error("Unable to recieve data.\n");
				}
				printf("%s", buffer);

				if (send(sd_current, "OK", 5, 0) < 0) {
					error("Unable to send data.\n");
				}
			}

Není mi ale jasné proč neproběhne tato část:

if (n == 0){
	exit(0);
	}

I když jsem tam zkusil dát testovací výpis tak ten se vypíše až po provedení druhého recv. Což mi nějak nedává moc logické souvislosti..

Jo a n == 0. To jsem si ověřil

Děkuji za pomoc

Nahlásit jako SPAM
IP: 80.92.240.–
Reklama
Reklama
liborb
~ Redaktor
+18
Guru
22. 11. 2011   #2
-
0
-

A když si dáš breakpoint za ten první recv, co je v tom buffer? A co vrací ten první recv?

No a na výpisy (takto) se samozřejmě nemůžeš spolehnout. Nejspíš by pomohl nějaký flush, ale lepší je používat assert makro (pro kontrolu stavů, které "nikdy nemohou nastat") a pak nezávislé výpisy jako jsou např. pod Windows OutputDebugString.

Nahlásit jako SPAM
IP: 78.80.52.–
Redby0
Návštěvník
22. 11. 2011   #3
-
0
-

#2 liborb
No funguje to takto. První recv přijme to co má, pak printf to vypíše, poté se ale nic neděje a čeká se na další recv a po prevedení druhého recv se teprve provede to co bylo mezi nima. Přijde mi to jako by to čekalo na konec recv...

Nahlásit jako SPAM
IP: 80.92.240.–
liborb
~ Redaktor
+18
Guru
22. 11. 2011   #4
-
0
-

Pokud máš soket blokující, tak recv čeká. To je fakt, ale jinak to nedává smysl (leda bys to měl ve vlákně a to pustil omylem 2x). Pokud si to nemůžeš krokovat, tak kontrolní výpisy řádek po řádku. Prostě není možný, aby ti to vlezlo do toho cyklu a pak teprve zabral exit.

Nahlásit jako SPAM
IP: 78.80.52.–
Redby0
Návštěvník
23. 11. 2011   #5
-
0
-

Tak jsem tu zase. Zkoušel jse se s tím poprat, ale stejně to nejde. Snažím se o to že první co přijde ze serveru je nějakej login a program má porovnat zda je to ve spravne formě a pokud ano tak teprve pokračovat dál. No a problém je pokud začnu používat funkci strcmp. pokud místo řádku dám jenom printf něco tak se vypis provede, ale pokud nechám to co zde mám, tzn. printf("%d", strcmp....) tak vysledek porovnani se mi vypiše až po tom co odešlu druhé data. Nějak nechápu v čom je problém. Pro jistotu dávám celý zdrojovy kod..

/*
 * Server.c
 *
 *  Created on: 24.10.2011
 *      Author: redby
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "LList.h"

void error(char *);

int main(int argc, char **argv) {

	char buffer[1024];
	char *temp;
	struct list *USERS;

	pid_t process;
	struct sockaddr_in serv_adr, cli_adr;
	int listenfd, sd_current, clilen;

	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		error("Unable to create socket.\n");
	} else {
		printf("Socket created.\n");
	}


	serv_adr.sin_family = AF_INET;
	serv_adr.sin_addr.s_addr = INADDR_ANY;
	serv_adr.sin_port = htons(1024);

	if (bind(listenfd, (struct sockaddr*) &serv_adr, sizeof(serv_adr)) < 0) {
		error("Unable to bind adress.\n");
		close(listenfd);
		exit(1);
	} else {
		printf("Client adress obtained.\n");
	}

	listen(listenfd, 5);

	while (1) {

		clilen = sizeof(cli_adr);

		sd_current = accept(listenfd, (struct sockaddr*) &cli_adr, &clilen);
		if (sd_current < 0) {
			error("Unable to accept connection.\n");
		} else {
			printf("Connection established.\n");
		}

		process = fork();

		if (process == 0) {

			close(listenfd);

			if (recv(sd_current, buffer, 255, 0) < 0) {
				error("Unable to recieve data.\n");
			} else {
				printf("First Data recieved.\n");
			}
			printf("%d", strcmp("#LOGIN#", buffer));

			while (1) {

				if (recv(sd_current, buffer, 255, 0) < 0) {
					error("Unable to recieve data.\n");
				} else {
					printf("Data recieved.\n");
				}
				

				if (send(sd_current, "OK", 5, 0) < 0) {
					error("Unable to send data.\n");
				} else {
					printf("Data has been sent.\n");
				}
			}
		} else {
			close(sd_current);
		}

	}
	close(listenfd);
	return 0;
}

/**
 * Vypis chybovych hlasek
 */

void error(char *message) {
	printf("Error: %s", message);
}

Nahlásit jako SPAM
IP: 78.136.163.–
Řešení
KIIV+42
God of flame
23. 11. 2011   #6
-
0
-
Vyřešeno Nejlepší odpověď

no bude dost zalezet kam to vypisujes... vypisy ktere ti tam funguji - maji na konci \n ?  na standardnim vystupu to zpusobi obvykle vyprazdneni bufferu (tady je to vlastne vypsani)

pokud logujes do souboru tak tam ani \n nepomuze a jede to az po celejch kdo vi jak velkejch bufferech...

flush() nikde nepouzivas takze to klidne tim byt muze

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Redby0
Návštěvník
23. 11. 2011   #7
-
0
-

#6 KIIV
Gratuluji k povýšení na Hero. Jinak vypisuji normálně na obrazovku. Pokud dám normálně výpis printf("%s", buffer) tak se to normálně vypíše. Tak si myslím že tím \n to nebude. Zkoušel jsem i ten znak \n připojit k posilanemu stringu a poslat a taky nic. Co se týka flush tak mě to napadlo ale nikde nějak nemohu najít správné použití. V socketech se to moc nepoužívá..

Nahlásit jako SPAM
IP: 78.136.163.–
Redby0
Návštěvník
23. 11. 2011   #8
-
0
-

Tak opět HERO poradil. Zkusil jsem ten fflush a zatím to běhá.. Takže díky.. Holt se nesmí věřit všem diskuzím...

Nahlásit jako SPAM
IP: 78.136.163.–
KIIV+42
God of flame
23. 11. 2011   #9
-
0
-

no flush uz zminil liborb prvni.. jen sem to musel pripomenout :)

Nahlásit jako SPAM
IP: 94.112.32.–
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, 39 hostů

Podobná vlákna

Pomalá odezva webu — založil hlucheucho

Konfigurace serveru — založil Machta

HW konfigurace serveru — založil WoSSa

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ý