Está en la página 1de 11

COMENZANDOCONLOSSOCKETSENANSIC

Sagrini:elhacker.net
1.)Introducin.
2.)FuncionesprincipalesI.
3.)FuncionesprincipalesII.
4.)UsodesocketsenWindows.
5.)Final.
1.)Introducin
Medecidaescribirestemanualporquemuchagente
enelforotienealgunasdudaconelusode
socketsenAnsiC.Todaslasdudasenelforo.
ComentoquenecesitarisalgodeexperienciaenC,no
osvoyaexplicarloqueesintmain().
Lasliberasausarson:

#include<arpa/inet.h>//structsockaddr_in
#include<sys/socket.h>//Socket,Connect...

2)FuncionesprincipalesI
2.1)Funcinsocket();
Laprimerafuncinquevamosaestudiaressocket.
Estafuncininicializaelsocketparasuuso...
LoquehaceesmeterenunavariabletipoINTun
descriptorparausarloenotrasfunciones.Uso:
intsockfd=socket(2,1,0);

Bueno,lacosaesdeclararunavariableypasarla
comoreturnalafuncinsocket.Distintostiposde
argumentossepuedenverenGoogle!Estosahora
mismosonsuficientes,peroelsabernomata...
2.2)Funcinclose();
Estoseusaparacerrarelsocketunavezusado.
Silodejamosabierto,podramosteneralgunos
problemasluego...
Esmuysencillo.Lepasascomoargumentoel
descriptordesocket.Ennuestrocasoessockfd.

Evidentementesedebecambiarencadauno...
intsockfd=socket(2,1,0);
close(sockfd);

2.3)Estructurastructsockaddr//sockaddr_in
Enestaestructuraseusaparaguardarlosdatos
delasconexiones(Ej:ip,puerto,familia...).Lo
explicaremostodo...
Bueno,sedeclaraas.
structsockaddr_inhost;
structsockaddr_inclient;

Structsockaddrseusaporcompatibilidad...
Bueno,yavereis...Unavezdeclaradalaestructuray
eldescriptordesocket,rellenamoslaestructura...
host.sin_addr.s_addr=0;//Asrellenamosladireccin
connuestraIPenordende
bitsdered.Paraescuchar.
host.sin_port=htons(31337);
//HTONSpasaunnumero(puerto)
aordendebitsdered.Es
paraqueelPCloentienda.
host.sin_family=AF_INET;
//EstaeslafamiliadeIpv4.
Yolasuelodejaras.
memset(host.sin_zero,0,8);
//Rellenaelrestodela
estructuraconceros.As.

Estaseusaparaescuchar.Paraconectar...
host.sin_addr.s_addr=arpa_inet(127.0.0.1);//IP
host.sin_port=htons(31337);
//HTONSpasaunnumero(puerto)
aordendebitsdered.Es
paraqueelPCloentienda.
host.sin_family=AF_INET;
//EstaeslafamiliadeIpv4.
memset(host.sin_zero,0,8);
//Rellenaelrestoconceros.

Estasestructurassonmuyimportantes,y
contienenlosdatosqueusamos.
2.4)Funcinconnect();
EstoseusaparaconectarnosacualquierIP.Usa
lasestructurasantesvistas.Osacordaisdeloque
dijeantesdelacompatibilidad?Esparaesto...

Susargumentosson:
connect(sockfd,(structsockaddr*)&host,sizeof(struct
sockaddr*));

Pocoapoco.sockfdeseldescriptorqueseusa
paraguardareldescriptorconelquemandamosy
recibimosdatos.
Losiguienteesuntypedef.Eshaceruna
variableotrotipodevariable.Sehacepor
compatibilidad(porterceravez).Selepasauna
direccinaunaestructura,nounaestructura
completa...
Loterceroeseltamaodelaestructura.Sehace
fcilconsizeof.Esporseguridad.
2.5)Funcinbind();
Estoesdiferenteaconectar.Nooslieis!
Estoseusaparaprepararunsocketparaescuchar
ennuestramquina.Usatantolasestructurasde
antescomolodelacompatibilidad.
Susargumentosson:
bind(sockfd,(structsockaddr*)&host,sizeof(structsockaddr*));

Sonexactamenteigualesquelosdeconnect.Slo
seeliminanewsock,puesaquseguimosusando
sockfd.Annecesitamosusardosfuncionesms.
2.6)Funcinlisten();
Estoesotropasoparaescuchar.Susargumentos
son:
listen(sockfd,1);

Sockfdeselsocketquehemosusadoantes.Lo
segundoeselnmerodeconexionesquepuede
aceptar.Enestemanuallodejamosenuna.
2.7)Funcinaccept();
Estoeselltimopasoparaaceptarunaconexin.
AquotrosPCsseconectan.

inta=sizeof(structsockaddr*);
structsockaddr_inclient;
intnewsock=accept(sockfd,(structsockaddr*)&client,&a);

Enestafuncinhayquedeclarara,que
contieneeltamaodestructsockaddr*.Aaccept,
queselepasaladireccindela
variable,nolavariable.
Ahoraseusanewsock,queluegousamospara
enviaryrecibirdatos.Apartirdeaqupodis
cerrarsockfd,puesyanolousamosms.
Clientseusaparaguardarlosdatosdelquiense
conecta.LuegopodeisescribirlasIPsdequiense
conectaavosotros,elpuertoqueusa,etc...Se
declaraaparte.Aclaroqueaquelprogramasepara
hastaquealguienseconecta.
2.0)Cdigodedemostracin.

#include<stdio.h>//Funcionesbasicas
entrada/salida
#include<string.h>//StrCmp
#include<stdlib.h>//Exityotras
#include<arpa/inet.h>//structsockaddr_in
#include<sys/socket.h>//Socket,Connect...
structsockaddr_inhost,client;//Declaraciones
inta=sizeof(structsockaddr);
intnewsock;
intsockfd;
intmain(intargc,char*argv[])
{
printf("Code1.0BySagrini(2010)\n");
if((sockfd=socket(2,1,0))==1)
{
printf("Errorabriendosocket...\n\n");
return1;
}
host.sin_port=htons(31337);
host.sin_family=AF_INET;
host.sin_addr.s_addr=0;
memset(host.sin_zero,0,8);
if(bind(sockfd,(struct
sockaddr*)&host,sizeof(host))==1)
{
printf("Errorhaciendobinding...\n\n");
return1;
}
if(listen(sockfd,5)==1)
{

printf("Errorescuchando...\n\n");
return1;
}
if((newsock=accept(sockfd,(struct
sockaddr*)&client,&a))==1)
{
printf("Erroresperandoconectando...\n\n");
return1;
}
printf("Gotconnectionfrom%s:%d\n",inet_ntoa
(client.sin_addr),ntohs(client.sin_port));
close(sockfd);
close(newsock);
return0;
}

3)FuncionesprincipalesII
3.1)Funcinrecv();
OtrafuncionmuyimportanteesRECV.Essencillamente
pararecibirdatos..Seusaunavezconectadoocon
algunclienteconectadoati.
charbuffer[1024];
recv(newsock,&buffer,sizeof(buffer),0);

Bueno,lacosaespasarleeldescrpitorde
socket,unbuffer,sutamao,yuncero.Parael
tamaoseusasizeof.Esunamedidadeseguridad.
3.2)Funcinsend();
LasiguientefuncionesSEND.Evidentementeseusa
paramandardatos.Tambinseusaunavezconectado
oconalgunclienteconectadoati.
charbuffer[1024];
send(newsock,&buffer,sizeof(buffer),0);

Usalosmismosargumentosquerecv().Seusan
conjuntamente.
3.3)Funcininet_addr();
Bueno,estafuncinseusaparapasarunaIPa
ordendebitsdered.Lahemosvistoantesenla
estructurasockaddr_in.Suargumentoesunacadena
conunaIP.Devuelveotracadena.

3.4)Funcinhtons();
Bueno,estafuncinseusaparapasarunpuertoa
ordendebitsdered.Lahemosvistoantesenla
estructurasockaddr_in.Suargumentoesunnmero.
3.5)Funcininet_ntoa();
Estafuncinescontrariaainet_addr.Pasalosbytes
enordenderedacadena.Suargumentoesunpuntero
alaestructurastructsockaddr*.sin_addr.
3.5)Funcininet_ntoa();
Estafuncinescontrariaahtons.Pasalosbytesen
ordenderedanmero.Suargumentoesunpunteroa
laestructurastructsockaddr*.sin_port.
3.0)Cdigodedemostracin

#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<time.h>
intsocketfd,newsocket;
char*filename;
voidshutup(intsignal)
{
FILE*log;
log=fopen(filename,"a+");
times();
printf("Shuttingdown...\n\n");
fprintf(log,"Shuttingdown...\n\n");
fclose(log);
close(newsocket);
close(socketfd);
exit(0);
}
inttimes()
{
FILE*log;
time_tnow=time(0);
structtm*ahora;
charbuffer[40];
ahora=localtime((consttime_t*)&now);
strftime(buffer,40,"%d/%m/%Y%H:%M:%S",
ahora);
log=fopen(filename,"a+");
printf("%s",buffer);

fprintf(log,"%s",buffer);
fclose(log);
return0;
}
intmain(intargc,char*argv[])
{
time_tnow=time(0);
structtm*ahora;
charhora[40];
ahora=localtime((consttime_t*)&now);
strftime(hora,40,"%d/%m/%Y%H:%M:%S",ahora);
printf("SmallServ2.0BySagriniSagrini
2010%s\n",hora);
if(getuid()!=0)
{
printf("Thisproccessmustberunby
root.\n\n");
return1;
}
if(argc<3)
{
printf("Use:%s<PORT><LOG>
[MODE]\nMode:\t\t0)Forktheproccesstobackground
[DEFAULT].\n\t\t1)Runintheterminal.\n\n",argv
[0]);
return1;
}
intcont;
FILE*log;
structsockaddr_inclient,host;
charbuffer[1024];
intsize=sizeof(client);
filename=argv[2];
socketfd=socket(2,1,0);
host.sin_family=AF_INET;
host.sin_port=htons(atoi(argv[1]));
host.sin_addr.s_addr=0;
bind(socketfd,(structsockaddr*)&host,sizeof
(structsockaddr));
listen(socketfd,3);
log=fopen(filename,"a+");
times();
if(argv[3]!=NULL&&atoi(argv[3])==1)
printf("\nStartingup...\n\n");
fprintf(log,"Startingup...\n\n");
fclose(log);
signal(SIGTERM,shutup);
signal(SIGINT,shutup);

if(argv[3]==NULL||atoi(argv[3])==0)
daemon(1,0);
while(1)

{
newsocket=accept(socketfd,(struct
sockaddr*)&client,&size);
log=fopen(filename,"a+");
times();
printf("Gotconnectionfrom%s:%d\n",
inet_ntoa(client.sin_addr),ntohs
(client.sin_port));
fprintf(log,"Gotconnectionfrom%s:%d\n",
inet_ntoa(client.sin_addr),ntohs
(client.sin_port));
fclose(log);
cont=recv(newsocket,&buffer,1024,0);
while(cont>2)
{
printf("%d",cont);
log=fopen(filename,"a+");
times();
buffer[cont1]='\0';
printf("RECV%dbytes:%s",cont2,
buffer);
fprintf(log,"RECV%dbytes:%s\n",
cont2,buffer);
fclose(log);
cont=recv(newsocket,&buffer,1024,0);
}
log=fopen(filename,"a+");
times();
printf("Finishingconnectionfrom%s:
%d\n\n",inet_ntoa(client.sin_addr),ntohs
(client.sin_port));
fprintf(log,"Finishingconnectionfrom%s:
%d\n\n",inet_ntoa(client.sin_addr),ntohs
(client.sin_port));
fclose(log);
close(newsocket);
}
close(socketfd);
return0;
}

Estecodeeselmismoqueantes,perocompleto.
Eselcdigofuenteoriginal.
4)SocketsenWindows
4.1)FuncinWSAStartup();
Microsoftcambiaalgunascosasalahoradeprogramar
enWindows.Asdemalotesson...
Bueno,unadeesascosasesquealahorade
usarsockets,tenemosqueinicializarlosdeotra

forma.Primero,ennuestrocodedespusdeltpico
if(argc!=3)tienequeiralgoas.
WSADATAwsa;
WSAStartup(MAKEWORD(2,2),&wsa);

Estoesparaimplementaralgunascosillas.Nome
enrollareneso.Bastasaberqueseusaentodos
losprogramasconsockets.
4.2)Linkeandoalcompilar
Otracositaquefastidiaunpocoesquealahora
decompilartenemosquelinkearaunalibrera.En
miPCsehaceas.
gccocode.execode.clwsock32

EnotrosWindowscambia.TocamiraraGoogle...
PD:Hayotrasformasmselegantesdehacerlo,pero
yolohagoas.
4.3)Declararycerrarsockets.
Bueno,seguimos.Otrodetalleesquealahorade
declararlosdescriptoresdesockettenemosque
usareltipoSOCKET.Seescribeas,enmayscula.No
mehemolestadoenmirarlo,nomerecelapena,pero
creoqueeslomismoqueint.Detodosmodosde
otraformadaerror...
Yalahoradecerrartenemosqueusarlafuncin
closesocket();Esexactamenteigualqueclose();
Slocambiaelnombre(Slo?).
4.4)RecvySend
ltimodetalle.EnlasfuncionesRECVySEND
pasamosladireccindebufferas:
recv(newsock,&buffer,sizeof(buffer),0);
send(newsock,&buffer,sizeof(buffer),0);

PerolosdeWindowsquierenquelohagamosde
otraforma...
recv(newsock,buffer,sizeof(buffer),0);
send(newsock,buffer,sizeof(buffer),0);

Estosedebeauncambioenladeclaracin.Si
pasamosloprimeromandamosunpunteroaunpuntero
aunchar.Encambiodelasegundaformaesun
punteroaunchar.Caprichosos...
4.0)Cdigodedemostracin.

#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
SOCKETsockfd,newsock;
char*filename;
inttimes()
{
time_tnow=time(0);
structtm*ahora;
charbuffer[40];
ahora=localtime((consttime_t*)&now);
strftime(buffer,40,"%d/%m/%Y%H:%M:%S",ahora);
printf("%s",buffer);
return0;
}
intmain(intargc,char*argv[])
{
WSADATAwsa;
WSAStartup(MAKEWORD(2,2),&wsa);
time_tnow=time(0);
structtm*ahora;
charhora[40];
ahora=localtime((consttime_t*)&now);
strftime(hora,40,"%d/%m/%Y%H:%M:%S",ahora);
printf("SmallServ2.0BySagriniSagrini2010%s\n",
hora);
if(argc!=2)
{
printf("Use:%s<port>\n\n",argv[0]);
return1;
}
intcont;
structsockaddr_inclient,host;
charbuffer[1024];
intsize=sizeof(client);
sockfd=socket(2,1,0);
host.sin_family=AF_INET;
host.sin_port=htons(atoi(argv[1]));
host.sin_addr.s_addr=0;
bind(sockfd,(structsockaddr*)&host,sizeof(struct
sockaddr));
listen(sockfd,3);

times();
printf("Startingup...\n\n");

while(1)
{
newsock=accept(sockfd,(structsockaddr*)&client,
&size);
times();
printf("Gotconnectionfrom%s:%d\n",inet_ntoa
(client.sin_addr),ntohs(client.sin_port));
cont=recv(newsock,buffer,1024,0);
while(cont>2)
{
printf("%d",cont);
times();
buffer[cont1]='\0';
printf("RECV%dbytes:%s\n",cont2,
buffer);
cont=recv(newsock,buffer,1024,0);
}
times();
printf("Finishingconnectionfrom%s:%d\n\n",
inet_ntoa(client.sin_addr),ntohs(client.sin_port));
closesocket(newsock);
}
closesocket(sockfd);
return0;
}

Siosdaiscuenta,heborradoalgunasfunciones.Eso
sedebeaquealpasarelcodeaWindowsmedaba
perezacambiaralgunascosas...Todoesculpadela
telejeje...
5.)Final
Bueno,estaeslapartequenadieleeenlaque
elautorsedespideydicelosagradecimientos.
Graciasporleermejeje...
Primero,graciasalosqueestnenelforo
echndomeunamanitadevezencuando.Graciasal
staffyaelbrujo,porelgrantrabajoqueestis
haciendo.Graciasalosusers,algunoscolaboran
mejorqueotros,perosoispartedelacomunidad...
Graciasamifamilia,quenopuedefaltar,ya
misamigos.Evidentementenoleernestonunca,pero
bueno...Muchasgraciasporleer.Esperovuestros
comentarios.Todacrticabienvenida.GRACIAS!!!
Sagrinienelhacker.net:sagrini@elhacker.net

También podría gustarte