C++ sockety

Programovacie jazyky, rady, poradňa...
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

C++ sockety

Príspevok od používateľa jorg22 »

Snazim sa robit pripojenie cez sockety a posielat HTTP packety, aj mi to cele funguje ale na jednej stranke mam problem pri prijmani dat.
Zo serveru mi prijde hlavicka packetu ale s ukoncovacim znakom CRLF este pred tym nez sa nacitaju vsetky data.
Viem ze tie data potom pridu lebo cez wireshark ich dokazem vidiet. Ako spravim to aby sa prijmali data az do ukoncenia timeoutu s tym ze to bude ukoncovat vsetky ukoncovacie znaky?

V C++ pouzivam kniznicu winsock2.h a na prijmanie dat funkciu recv.

Dakujem.
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: C++ sockety

Príspevok od používateľa c-ice »

problem je v obmedzeni 64kB ked subor presahuje tuto hodnotu deli sa a ide po kuskoch ... niekde to mam vyriesene nejakym cyklom pri tom prijmani ... v jedno projekte mozem upnut vnoci
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: C++ sockety

Príspevok od používateľa jorg22 »

Pri prijmani som skusal aj cyklus, ale nic nove proste neprijme. A ten subor urcite nema 64kb lebo to je len par slov z hlavicky.
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: C++ sockety

Príspevok od používateľa c-ice »

ok neviem potom o com hovoris skus okopirovat hlavicky alebo co ... no ja sa stretol pri tomto prave stym ze mi chodili fajly vacsie ako 64kB a potom boli ze Chunked Data a prisla prva cast suboru ktora sa tvarila ze vsetko OK super parada ale potom este zvysok posielalo a to uz nikto neprijmal ... ja to riesil ze cyklus cakal a prijmal kym neprijme "</html>" ...

Kód: Vybrať všetko

//... inicializacia ?
	WSADATA	WsaData;
	WSAStartup (0x0101, &WsaData);


	sockaddr_in       sin;
	int sock = socket (AF_INET, SOCK_STREAM, 0);
	if (sock == -1) {
		return "-100";
	}
	sin.sin_family = AF_INET;
	sin.sin_port = htons( (unsigned short)80);

	struct hostent * host_addr = gethostbyname(strcReq.sockHostName);
	if(host_addr==NULL) {
		AfxMessageBox( "Unable to locate host");
		return "-103";
	}
	sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ;
	//AfxMessageBox("Port :%s , Address :%s ",sin.sin_port,sin.sin_addr.s_addr);

	if( connect (sock,(const struct sockaddr *)&sin, sizeof(sockaddr_in) ) == -1 ) {
		AfxMessageBox("connect failed") ;
		return "-101";
	}
//.........
char c1[1];
	CString message;
	int l,line_length;
	bool loop = true;
	bool bFound = false;
	bool bOk = false;
	bool bRecv = false;
	int iLocationTest=-1,iEndTest=-1,iRPEnd=-1,iRPEndTest=0;
	do{
		loop=true;
		iRPEnd=message.GetLength();
		while(loop) {
			l = recv(sock, c1, 1, 0);
			if(l<0) loop = false;
			if(message.Find("</html>") != -1)loop=false;
			if(c1[0]=='\n') {
				if(line_length == 0) loop = false;

				line_length = 0;
				if(message.Find("302") != -1)
					bFound = true;
				if(message.Find("200 OK") != -1)
					bOk = true;
			}
			else if(c1[0]!='\r') line_length++;
			//_DEBUG_PRINT( cout<<c1[0]);
			message += c1[0];
		}
		iLocationTest=message.Find("Location: ");
		iEndTest=message.Find("</html>");
		//if(strcReq.strOptional.Find("GET")!=-1)iRPEnd=-1;
		//	else iRPEnd=strcReq.sockHostName.Find("rpx.azet.sk");//aby sa cyklus ukoncil pri odoslani RP :)
		iRPEndTest=message.GetLength()-1;
	}while((iLocationTest==-1)&&(iEndTest==-1)&&(iRPEnd!=iRPEndTest)&&(bFound!=true));
	WSACleanup( );
	return message;
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: C++ sockety

Príspevok od používateľa jorg22 »

Tak ja ti ukazem jaky packet mi prijde, ale aj v hexadecimalnej sustave lebo niektore znaky niesu viditelne:


00000000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK.
00000010 0a 44 61 74 65 3a 20 54 68 75 2c 20 31 37 20 4e .Date: T hu, 17 N
00000020 6f 76 20 32 30 31 31 20 30 38 3a 33 33 3a 34 38 ov 2011 08:33:48
00000030 20 47 4d 54 0d 0a 43 6f 6e 74 65 6e 74 2d 54 79 GMT..Co ntent-Ty
00000040 70 65 3a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f pe: appl ication/
00000050 6f 63 74 65 74 2d 73 74 72 65 61 6d 0d 0a 43 6f octet-st ream..Co
00000060 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 0d nnection : close.
00000070 0a 0d 0a 00 0b 00 82 79 68 74 74 70 73 3a 2f 2f .......y https://
00000080 61 70 70 73 2e 66 61 63 65 62 6f 6f 6b 2e 63 6f apps.fac ebook.co
00000090 6d 2f 74 68 65 73 69 6d 73 73 6f 63 69 61 6c 2f m/thesim ssocial/
000000A0 66 65 65 64 3f 70 66 5f 66 65 65 64 5f 74 6f 6b feed?pf_ feed_tok
000000B0 65 6e 3d 63 32 38 63 37 37 33 35 65 31 66 65 30 en=c28c7 735e1fe0
000000C0 34 31 64 38 38 39 30 63 64 36 39 33 66 33 63 32 41d8890c d693f3c2
000000D0 34 63 34 66 34 34 32 39 36 30 36 65 61 32 31 65 4c4f4429 606ea21e
000000E0 65 37 65 36 37 63 32 32 33 30 35 35 31 62 30 36 e7e67c22 30551b06
000000F0 34 34 63 33 31 66 37 64 31 39 62 36 33 38 61 61 44c31f7d 19b638aa
00000100 39 64 36 38 35 37 38 63 35 30 64 39 65 34 63 37 9d68578c 50d9e4c7
00000110 37 63 32 37 30 35 37 31 33 34 65 66 63 36 36 31 7c270571 34efc661
00000120 64 62 34 61 33 38 39 61 65 36 36 65 36 33 61 32 db4a389a e66e63a2
00000130 64 63 30 31 63 65 37 62 35 64 35 37 62 36 63 66 dc01ce7b 5d57b6cf
00000140 36 35 33 39 62 61 65 31 62 65 64 33 33 66 61 34 6539bae1 bed33fa4
00000150 64 63 65 38 65 30 64 64 63 63 30 62 65 62 62 33 dce8e0dd cc0bebb3
00000160 39 63 62 35 34 61 38 32 62 65 36 63 65 37 39 38 9cb54a82 be6ce798
00000170 36 36 38 32 66 32 32 64 65 37 39 63 33 61 37 63 6682f22d e79c3a7c
00000180 33 36 37 32 34 64 64 61 34 32 34 36 32 66 39 35 36724dda 42462f95
00000190 39 36 35 35 31 64 35 61 35 61 66 65 33 35 65 30 96551d5a 5afe35e0
000001A0 65 36 62 61 39 39 36 37 66 30 33 38 34 66 36 65 e6ba9967 f0384f6e
000001B0 66 66 33 26 70 66 5f 66 65 65 64 5f 74 79 70 65 ff3&pf_f eed_type
000001C0 3d 31 26 70 66 5f 72 65 66 3d 66 67 5f 77 5f 31 =1&pf_re f=fg_w_1
000001D0 5f 36 34 35 30 61 37 31 30 66 66 30 34 35 30 39 _6450a71 0ff04509
000001E0 61 64 61 33 38 61 61 33 30 61 34 35 33 64 63 34 ada38aa3 0a453dc4
000001F0 33 01 02 02 0f 31 30 30 30 30 33 30 37 33 32 31 3....100 00307321
00000200 36 37 33 36 01 81 56 6736..V



0D 0A to je v hexadecimalnej stustave CR\LF a v tom packete je dva krat za sebou cervernym vyznaceny, co podla mna uzatvara automaticky komunikaciu ale niesom si isty lebo na nete o tom neviem vela najst. To co je modrym mi uz do programu neprijde, ale sniffer to dokaze precitat.

Na tejto stranke som zistil ze sa to nazyva CR/LF

Kód: Vybrať všetko

http://mc-computing.com/languages/CR_LF.htm
A ja potrebujem aby mi to ignorovalo 0D 0A a prijalo aj to co je modrym.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C++ sockety

Príspevok od používateľa metthal »

Nedalo by sa keby si pastol kod? Podla mna bude chyba niekde tam, ze po najdeni CRLF/LF skonci citanie.
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: C++ sockety

Príspevok od používateľa jorg22 »

Odosielanie a prijmanie:

Kód: Vybrať všetko

       send(s, cele.c_str(), cele.length(), NULL);

	BYTE *odpoved;
	odpoved = new BYTE[1024];

	while(recv(s, (char*)odpoved, 1024,MSG_PARTIAL) != NULL)
		cout << odpoved;
Nastavenie pripojenia:

Kód: Vybrať všetko

SOCKET s; //Socket handle

//CONNECTTOHOST Connects to a remote host

bool ConnectToHost(int PortNo, char* IPAddress)
{
    //Start up Winsock
    WSADATA wsadata;

    int error = WSAStartup(0x0202, &wsadata);

    //Did something happen?
    if (error)
        return false;

    //Did we get the right Winsock version?
    if(wsadata.wVersion != 0x0202){
        WSACleanup(); //Clean up Winsock
        return false;
    }

    //Fill out the information needed to initialize a socket
    SOCKADDR_IN target; //Socket address information

    target.sin_family = AF_INET; // address family Internet
    target.sin_port = htons (PortNo); //Port to connect on
    target.sin_addr.s_addr = inet_addr (IPAddress); //Target IP

    s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create socket
    if (s == INVALID_SOCKET){
        return false; //Couldn't create the socket
    }  

    //Try connecting...


    if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR) {
        return false; //Couldn't connect
    }
    else
        return true; //Success
}
Dufam ze to staci.

//autoeditácia príspevku (17 Nov 2011, 14:39)
Dakujem vsetkym za pomoc, zistil som ze ono mi to prijma vsetko ale musel som ostranit CR\LF z retazca a potom uz sa dal vypisat cely :) .
Uplne som zabudol ze \0 ukoncuje retazec a ze je to to iste ako LF.
Napísať odpoveď