» »

[C++] bind

[C++] bind

goranv ::

Pri tem preprostem programu (C++) se mi program ustavi ze pri ukazu "bind". Rad bi se povezal na neko stran ali racunalnik. Kako naj to resim? Delam v MVS2005SP1.


#include "stdafx.h"

#include "windows.h"
#include "winsock.h"
#include "string.h"
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
       SOCKET sck;
	WSAData WSAdata;
	SOCKADDR_IN addrin;

	WSAStartup(MAKEWORD(2,2), &WSAdata);

	if ((sck=socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		printf("socket() ni uspel");
		return 1;
	}
	
	addrin.sin_family=AF_INET;
	addrin.sin_port=htons(1235);
	addrin.sin_addr.s_addr=inet_addr("http://www.google.com");
	memset( &(addrin.sin_zero), '\0', 8);
	
	printf("bind\n");
	if(bind(sck,(SOCKADDR*)&addrin,sizeof(addrin)) == -1 )
	{
		printf("bind error\n");
		return 1;
	}

	if(listen(sck,10) == -1)
	{
		printf("listen error");
		return 1;
	}
	printf("bind exit\n");

	int v=sizeof(addrin);
	bool result=getsockname(sck,(SOCKADDR*)&addrin, &v);
	if(result)
		printf("%d\n%s\n",(int)(ntohs(addrin.sin_port)),
			inet_ntoa(addrin.sin_addr));
	else
		printf("error result\n");
}


Lp

napsy ::

"If you die, you die. But when you live you live. There is no time to waste."

goranv ::

Sem pregledal to stran in se druge in pri bind se ustavi.
Nasel sem tudi neko demo kodo programa ki deluje kot server ki samo caka ukaze in potem nekaj naredi. Tudi on se ustavi pri bind.
V pozarnem zidu program ni blokiran. Nevem kaj je narobe.

rasta ::

Iz inet_addr() manuala:
The  inet_addr()  function  converts  the Internet host address cp from
numbers-and-dots notation into binary data in network byte  order. If 
the input is invalid, INADDR_NONE (usually -1) is returned.


Sit ti prepričan, da ti inet_addr funkcija prebavi "http://www.google.com"?

Zgodovina sprememb…

  • spremenil: rasta ()

napsy ::

inet_addr() pozna samo IP naslove. Če želiš uporabljati domene, moraš iz tvojega naslova najprej dobiti IP. To pa lahko storiš s funkcijo gethostbyname(), ki vrne strukturo v kateri je turi IP zapisan. Drugače je pa tvoja koda malo nenavadna ker uporabljaš listen(), ki čaka na tuje povezave, hkrati se pa hočeš povezat nekam.
"If you die, you die. But when you live you live. There is no time to waste."

iztok04 ::

Namesto #include "winsock.h" raje uporabi #include "winsock2.h".
Bo najbrz drzalo to, kar je napisal napsy, da je koda malce nesmiselna. Ce bi se rad povezal na nek remote IP, potem imas opravka s client programom, ki pa funkcije bind() in listen() ne potrebuje -> omenjeni funkciji sta domena serverja.

Poizkusi namesto "http://www.google.com" vpisati direkten IP: 216.239.59.99. Vendar, ce klices funkcijo listen(), ki caka da se kdo poveze na dolocen port, bi moral namesto konkretnega IP naslova uporabiti "addrin.sin_addr.S_un.S_addr = INADDR_ANY", ki sprejme katerikoli oddaljeni IP, ki se zeli povezati. To velja, ce pises server.

Sicer pa, ce uporabljas blocking socket, se ti bo program pri funkciji listen() ustavil (zmrznil), dokler ne accept()-as povezave. Resitev je ali uporaba non-blocking socketa, ali pa handlanje povezave v samostojnem thrade-u.

LP

fiction ::

Ok, par popravkov za stvari, ki so imho napacne:

INADDR_ANY ne pomeni da sprejmes katerikoli IP, ampak da poslusas na vseh IP naslovih od masine.
Lahko poslusas tudi samo na tocno dolocenem IP naslovu. Vse skupaj nima veze s tem koga sprejmes -
je pa res, da se bo na tvoj streznik, ce recimo poslusas na 127.0.0.1, lahko povezalo bolj malo ljudi.

listen() ne blokira. S tem samo poves da poslusas in kaksen queue imas.
accept() pa dejansko caka dokler ne more sprejeti povezave. Ce je tisti queue premajhen in
pride prevec klientov istocasno se zna zgoditi da nekaj povezav sploh ne bos "opazil".
Aja pa bind() ni nujno samo domena serverja - vcasih hoces uporabiti tocno dolocen
izvorni IP ali izvorni port pri povezavi na streznik - drugace izbiro naredi kernel.

goranv: Kot so ze pred mano napisali ne mores uporabiti
"http://www.google.com" ampak inet_addr("216.239.59.99").
Lahko pa uporabis tudi gethostbyname() ali kaksno podobno zadevo in resolvas
www.google.com. Samo glede na to, da gre za sockete, bos moral implementirati tudi
HTTP protokol (najbrz bos moral poslati GET ... HTTP/1.1 ali kaj takega, preden bos lahko kaj
pametnega dobil nazaj).
Aja pa namesto bind() hoces najbrz poklicati connect(), s tistim addrin oz. zdaj bo to bolj
addrout :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c] ne sprejme UDP paketa

Oddelek: Programiranje
7920 (508) slovencl
»

SMTP v c -ju

Oddelek: Programiranje
282055 (1196) BigWhale
»

Delo z omrezjem v linuxu

Oddelek: Programiranje
101215 (1061) CCfly
»

C: connect() funkcija, kako nastaviti timeout

Oddelek: Programiranje
231623 (1404) fefko-the-bulldog
»

Casovni problem v C/C++

Oddelek: Programiranje
91185 (1086) sid_dabster

Več podobnih tem