HTTP - zpracovani dat – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

HTTP - zpracovani dat – C / C++ – Fórum – Programujte.comHTTP - zpracovani dat – C / C++ – Fórum – Programujte.com

 

Kuba
~ Anonymní uživatel
59 příspěvků
7. 12. 2012   #1
-
0
-

Zdravim, potrebuji poradit, mam program, ktery posloucha portu, ktery mu zadam a kdyz se z prohlizece pripojim (localhost:port/soubor) tak mi program vypise co mi poslal prohlizec, to neni problem, ale jak z toho dostanu ven polozku 'soubor', vyzkousel jsem uz kde co, ale vetsinou jsem si to je zhorsil, chtel bych zadany soubor otevrit a poslat prohlizeci jeho obsah

zdroj:

#pragma comment(lib,"Ws2_32.lib")

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <iostream>

using namespace std;

int main(int argv, char *argc[])
{
	WORD wvr = MAKEWORD(1, 1);
	WSADATA data;
	sockaddr_in sName;
	sockaddr_in cInfo;
	SOCKET sock;
	int addrlen;
	int size;
	int port;
	char *dir;
	char *soubor;
	FILE *file;
	char buffer[1000];

	if(argv != 3)
	{
		cerr << "Chyba! Syntax programu: " << argc[0] << " port koren_webu" << endl; 
	}

	port = atoi(argc[1]);
	dir = argc[2];

	if(WSAStartup(wvr, &data) != 0)
	{
		cerr << "Chyba: selhal WSAStarup" << endl;
		return -1;
	}

	if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
	{
		cerr << "Nepodarilo se vytvorit socket" << endl;
		WSACleanup();
		return -1;
	}

	sName.sin_family = AF_INET;
	sName.sin_port = htons(port);
	sName.sin_addr.s_addr = INADDR_ANY;

	if(bind(sock, (sockaddr *)&sName, sizeof(sName)) == SOCKET_ERROR)
	{
		cerr << "Nepodarilo se pojmenovat socket" << endl;
		WSACleanup();
		return -1;
	}

	if(listen(sock, 10) == SOCKET_ERROR)
	{
		cerr << "Nepodarilo se poslouchat na zadanem socketu" << endl;
		WSACleanup();
		return -1;
	}

	while(true)
	{
		addrlen = sizeof(cInfo);
		SOCKET client = accept(sock, (sockaddr *)&cInfo, &addrlen);
		if(client == INVALID_SOCKET)
		{
			cerr << "Nepodarilo se prijmout spojeni" << endl;
			WSACleanup();
			return -1;
		}
		cout << "Pripojeni zaznamenano" << endl;
		
		size = recv(client, buffer, 999, 0);
		if(size < 0)
		{
			cerr << "Problem s prijetim dat" << endl;
			WSACleanup();
			return -1;
		}

		cout << "Prijato " << size << " bytu" << endl;
		cout << buffer << endl;
		
		
		
		size = send(client, buffer, strlen(buffer), 0);
		if(size < 0)
		{
			cerr << "Problem pri odesilani dat" << endl;
			WSACleanup();
			return -1;
		}

		cout << "Odeslano " << size << " bytu" << endl;
		closesocket(client);
	}
	closesocket(sock);
	WSACleanup();
	return 0;
}

v aktualnim souboru posilam prohlizeci zpatkz to co mi poslal, v dalsi verzi bych rad posilal obsah souboru

Diky za kazdou radu

Nahlásit jako SPAM
IP: 90.183.103.–
zlz
~ Anonymní uživatel
634 příspěvků
7. 12. 2012   #2
-
0
-

Pořadavek je na prvním řádku. Za ním jsou hlavičky ukončené prázdným řádkem. A za tím případně ještě mohou být odesílaná data.

A podle toho bys to měl načítat. Jeden recv(999) opravdu není ono. A nevidím, že bys ten buffer nuloval, nebo za data přidával ukončovací nulový znak a přesto s nimi pracuješ, jako s céčkovským řetězcem.

Jméno souboru je v tom prvním řádku, např. "GET /soubor HTTP/1.1".

Nahlásit jako SPAM
IP: 78.156.159.–
zlz
~ Anonymní uživatel
634 příspěvků
7. 12. 2012   #3
-
0
-

A to vlastně vidíš :)

S čím teda máš problém? S vytáhnutím druhého "slova" z řádku se třemi slovy oddělenými mezerami? To snad ne.

Nahlásit jako SPAM
IP: 78.156.159.–
Kuba
~ Anonymní uživatel
59 příspěvků
8. 12. 2012   #4
-
0
-

ve skutečnosti není problém to slovo vytáhnou, ale, vždy se mi za X znaků slova, které jsou ohraničení / a mezerou, přidá ještě 2 - 3 ascii znaky, a to neumím odstranit

Nahlásit jako SPAM
IP: 90.183.103.–
KIIV
~ Moderátor
+43
God of flame
8. 12. 2012   #5
-
0
-

No a ukoncujes spravne retezec? Pro jistotu si sem nedal kod, kterym to parsujes...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kuba
~ Anonymní uživatel
59 příspěvků
8. 12. 2012   #6
-
0
-

no ten kod jsem omylem smazal, ale nemel jsem tam memset, jak poznamenal zlz, dekuji za vasi pomoc, myslim, ze uz to pujde

Nahlásit jako SPAM
IP: 90.183.103.–
KIIV
~ Moderátor
+43
God of flame
8. 12. 2012   #7
-
0
-

nemusi byt nutne memset.. musi se akorat ukoncit retezec ... (jinak se vypisuje vse za retezcem nez narazi na znak '\0')

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

Moderátoři diskuze

 

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