Holas :).
Se puede hacer eso?.Tuve buscando pero no encontre nada para c/c++,era para otro lenguaje :S.
Si se puede me dan un ejemplo :).
Grax de antemano ;D.
Puedes hacerlo por sockets, pipes etc.
http://lucas.hispalinux.es/Universitarios/seminario-1.html
Sockets, FileMappings, utilizando la API SendMessage..
Saludos.
http://foro.elhacker.net/programacion_cc/como_sacar_una_ip_code-t299839.0.html#ixzz1CMjbGpRL
Eso seria un server. Para el client usaria hK 2.0, tmb mio, pero no lo tengo aqui. Si esta noche no puedo en mi casa, mañana te lo cuelgo y te mando un PM...
Recuerda retocar el code un poquito
El hK 2.0 tiene una funcion de escucha y otra de conex. Lo puedes usar para los dos:
./hK vl 31337
./hK vc 127.0.0.1 31337
Van perfectamente, aunque si en uno cierras la conex. el otro queda abierto hasta que mandas un mensaje :P
gracias a todos ;),voy a usar socket
Perdona la tardanza... Tienes ante ti el hK 2.0, ni más ni menos jeje...
¿Y que estabas usando? Claro que tienes que usar sockets!
#include <time.h> //Hora
#include <stdio.h> //Funciones basicas entrada/salida
#include <string.h> //StrCmp
#include <stdlib.h> //Exit y otras
#include <arpa/inet.h> //struct sockaddr_in
#include <sys/socket.h> //Socket, Connect...
struct sockaddr_in host, client; //Declaraciones
int a=sizeof (struct sockaddr);
char buffer [1024];
int cont = 2;
int newsock;
int sockfd;
int k = 0;
int listens (int port); //Funciones
int conect (char *IP, int port);
int scan (char *IP);
int times () //Esta funcion escribira la fecha en pantalla...
{
time_t now=time (0);
struct tm *ahora;
char buffer [40];
ahora= (struct tm*)localtime ((const time_t*)&now);
strftime (buffer, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("%s ", buffer);
return 0;
}
int finalizar (int state) //Esta funcion detendra el programa en caso de problemas...
{
close (sockfd);
if (state == 1)
{
printf ("Ocurrio un error en tiempo de ejecucion...\n");
exit (1);
}
else exit (0);
}
int help () //Mal uso de la linea de comandos...
{
printf ("Use:\thK <options> <target_ip // port> [port]\n");
printf ("Options:+d // +v [Daemon // Verbose]\n");
printf ("\t+l // +c // +z [Listen // Connect // Scan]\n\n");
printf ("\t./hK -l <port>\n");
printf ("\t./hK -c <target_ip> <port>\n");
printf ("\t./hK -z <target_ip>\n\n");
printf ("Exp:\t./hK dl 31337\n");
printf ("\t./hK vc 192.168.0.1 31337\n");
printf ("\t./hK vz 192.168.0.1\n\n");
exit (1);
}
int main (int argc, char *argv [])
{
time_t now=time (0);
struct tm *ahora;
char hora [40];
ahora=localtime ((const time_t*)&now);
strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("hK 2.0 - By Sagrini (2010) - %s\n", hora); //Esto escribira la presentacion.
if (argc < 3 || argc > 4) help (); //Diferentes opciones y mal uso de linea de comandos.
if (strlen (argv [1]) != 2) help ();
if (argv [1][0] != 'd' && argv [1][0]!= 'v') help ();
if (argv [1][1] != 'l' && argv [1][1]!= 'c' && argv [1][1]!= 'z') help ();
if (argv [1][1] == 'l' && argv [2] == NULL) help ();
if (argv [1][1] == 'c' && argv [3] == NULL) help ();
if (argv [1][1] == 'z' && argv [2] == NULL) help ();
if (argv [1][0] == 'd') daemon (1, 0);
if (argv [1][1] == 'l') listens (atoi (argv [2]));
if (argv [1][1] == 'c') conect (argv [2], atoi (argv [3]));
if (argv [1][1] == 'z') scan (argv [2]);
return 0;
}
int listens (int port) //Esta funcion esperara una conexion y printara todo lo que reciba...
{
if ((sockfd=socket (2, 1, 0))==1) finalizar (1);
host.sin_port=htons(port);
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) finalizar (1);
if(listen(sockfd,5)==-1) finalizar (1);
if((newsock=accept(sockfd, (struct sockaddr*)&client, &a))==-1) finalizar (1);
times ();
printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
close (sockfd);
int ID = fork ();
if (ID != 0)
{
do
{
fgets (buffer, 1024, stdin);
cont=send (newsock, &buffer, strlen (buffer), 0);
}
while (cont>1);
close (newsock);
close (sockfd);
printf ("Finishing connection with %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
}
else
{
cont=recv (newsock, &buffer, 1024, 0);
while (cont>1)
{
buffer [cont-1]='\0';
printf ("RECV %d bytes: %s \n", cont, buffer);
cont=recv (newsock, &buffer, 1024, 0);
}
close (newsock);
close (sockfd);
}
finalizar (0);
}
int conect (char *IP, int port) //Se conecta a una IP y a su puerto determinado para mandar datos...
{
if ((sockfd=socket (2, 1, 0))==1) finalizar (1);
host.sin_port=htons(port);
host.sin_family=AF_INET;
host.sin_addr.s_addr=inet_addr (IP);
memset (host.sin_zero, 0, 8);
if((connect (sockfd, (struct sockaddr*)&host, sizeof (host)))==-1) finalizar (1);
times ();
printf ("Got connection with %s:%d\n", inet_ntoa (host.sin_addr), ntohs (host.sin_port));
int ID = fork ();
if (ID != 0)
{
do
{
fgets (buffer, 1024, stdin);
cont=send (sockfd, &buffer, strlen (buffer), 0);
}
while (cont>1);
close (sockfd);
printf ("Finishing connection with %s:%d\n\n", inet_ntoa (host.sin_addr), ntohs (host.sin_port));
}
else
{
cont=recv (sockfd, &buffer, 1024, 0);
while (cont>1)
{
buffer [cont-1]='\0';
printf ("RECV %d bytes: %s \n", cont, buffer);
cont=recv (sockfd, &buffer, 1024, 0);
}
close (sockfd);
}
finalizar (0);
}
int scan (char *IP) //Sencillo escaner de puertos.
{
host.sin_addr.s_addr=inet_addr (IP);
host.sin_family=AF_INET;
memset (host.sin_zero, 0, 8);
for (cont = 0; cont < 65535; cont ++)
{
if ((sockfd=socket (2, 1, 0))==1) finalizar (1);
host.sin_port = htons (cont);
if (connect (sockfd, (struct sockaddr*)&host, sizeof (host)) != -1)
{
printf ("Port %d open\n", cont);
k++;
}
close (sockfd);
}
if (k == 0) printf ("All ports closed...\n");
else printf ("%d port(s) open(s)...\n", k);
finalizar (0);
}
jeje xD,lastima q no me va a funcionar de 1 :P,fork no funca en dev c++ :S,pero me va a servir para mejorar lo q tengo (Y).
+Karma
El otro dia lo pase a Windows, para tu suerte. Voy a ver si no lo borre jeje... Suerte que tienes!!!
Bueno, cabe decir que como lo pase en unos minutos le tuve que borrar unas cosillas. Ahora si escuchas no puedes mandar mensajes, solo recibir. Igual, si te conectas no recibes. Esto se debe a que le tengo que hacer un arreglillo para que pueda abrir dos procesos y subdivir el programa...
Evidentemente tienes mucho que retocar, pero sigue funcionando asi:
hK vl 31337
y
hK vc 127.0.0.1 31337
#include <time.h> //Hora
#include <stdio.h> //Funciones basicas entrada/salida
#include <string.h> //StrCmp
#include <stdlib.h> //Exit y otras
#include <winsock2.h> //Socket, Connect...
struct sockaddr_in host, client;//Declaraciones
int a=sizeof (struct sockaddr);
char buffer [1024];
int cont = 2;
SOCKET newsock;
SOCKET sockfd;
int k = 0;
int listens (int port); //Funciones
int conect (char *IP, int port);
int scan (char *IP);
int times () //Esta funcion escribira la fecha en pantalla...
{
time_t now=time (0);
struct tm *ahora;
char buffer [40];
ahora= (struct tm*)localtime ((const time_t*)&now);
strftime (buffer, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("%s ", buffer);
return 0;
}
int finalizar (int state) //Esta funcion detendra el programa en caso de problemas...
{
closesocket (sockfd);
if (state == 1)
{
printf ("Ocurrio un error en tiempo de ejecucion...\n");
exit (1);
}
else exit (0);
}
int help () //Mal uso de la linea de comandos...
{
printf ("Use:\thK <options> <target_ip // port> [port]\n");
printf ("\t-l // -c // -z [Listen // Connect // Scan]\n\n");
printf ("\t./hK -l <port>\n");
printf ("\t./hK -c <target_ip> <port>\n");
printf ("\t./hK -z <target_ip>\n\n");
printf ("Exp:\t./hK -l 31337\n");
printf ("\t./hK -c 192.168.0.1 31337\n");
printf ("\t./hK -z 192.168.0.1\n\n");
exit (1);
}
int main (int argc, char *argv [])
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
time_t now=time (0);
struct tm *ahora;
char hora [40];
ahora=localtime ((const time_t*)&now);
strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("hK 2.0 - By Sagrini (2010) - %s\n", hora); //Esto escribira la presentacion.
if (argc < 3 || argc > 4) help (); //Diferentes opciones y mal uso de linea de comandos.
if (strlen (argv [1]) != 2) help ();
if (argv [1][0] != '-') help ();
if (argv [1][1] == 'l' && argv [2] == NULL) help ();
if (argv [1][1] == 'c' && argv [3] == NULL) help ();
if (argv [1][1] == 'z' && argv [2] == NULL) help ();
if (argv [1][1] == 'l' && argv [3] != NULL) help ();
if (argv [1][1] == 'z' && argv [3] != NULL) help ();
if (argv [1][1] == 'l') listens (atoi (argv [2]));
if (argv [1][1] == 'c') conect (argv [2], atoi (argv [3]));
if (argv [1][1] == 'z') scan (argv [2]);
return 0;
}
int listens (int port) //Esta funcion esperara una conexion y printara todo lo que reciba...
{
if ((sockfd=socket (2, 1, 0))==1) finalizar (1);
host.sin_port=htons(port);
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) finalizar (1);
if(listen(sockfd,5)==-1) finalizar (1);
if((newsock=accept(sockfd, (struct sockaddr*)&client, &a))==-1) finalizar (1);
times ();
printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
closesocket (sockfd);
cont=recv (newsock, buffer, 1024, 0);
while (cont>1)
{
buffer [cont-1]='\0';
printf ("RECV %d bytes: %s \n", cont, buffer);
cont=recv (newsock, buffer, 1024, 0);
}
closesocket (newsock);
closesocket (sockfd);
printf ("Finishing connection with %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
finalizar (0);
}
int conect (char *IP, int port) //Se conecta a una IP y a su puerto determinado para mandar datos...
{
if ((sockfd=socket (2, 1, 0))==1) finalizar (1);
host.sin_port=htons(port);
host.sin_family=AF_INET;
host.sin_addr.s_addr=inet_addr (IP);
memset (host.sin_zero, 0, 8);
if((connect (sockfd, (struct sockaddr*)&host, sizeof (host)))==-1) finalizar (1);
times ();
printf ("Got connection with %s:%d\n", inet_ntoa (host.sin_addr), ntohs (host.sin_port));
do
{
fgets (buffer, 1024, stdin);
cont=send (sockfd, buffer, strlen (buffer), 0);
}
while (cont>1);
closesocket (sockfd);
printf ("Finishing connection with %s:%d\n\n", inet_ntoa (host.sin_addr), ntohs (host.sin_port));
finalizar (0);
}
int scan (char *IP) //Sencillo escaner de puertos.
{
host.sin_addr.s_addr=inet_addr (IP);
host.sin_family=AF_INET;
memset (host.sin_zero, 0, 8);
for (cont = 0; cont < 65535; cont ++)
{
if ((sockfd=socket (2, 1, 0))==1) finalizar (1);
host.sin_port = htons (cont);
if (connect (sockfd, (struct sockaddr*)&host, sizeof (host)) != -1)
{
printf ("Port %d open\n", cont);
k++;
}
else printf ("Port %d close\n", cont);
closesocket (sockfd);
}
if (k == 0) printf ("All ports closed...\n");
else printf ("%d port(s) open(s)...\n", k);
finalizar (0);
}
Suerte!
Recuerda que el code es mio, y se presento en un concurso...
Grax :),ya casi termino lo que toy haciendo xD.
Sagrini, creo que antes de gastar memoria deberías de checar si hay o no argumentos.
int main (int argc, char *argv [])
{
time_t now=time (0);
struct tm *ahora;
char hora [40];
ahora=localtime ((const time_t*)&now);
strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("hK 2.0 - By Sagrini (2010) - %s\n", hora);
Bah, eso ultimo se soluciona asi:
int main (int argc, char *argv [])
{
printf ("hK 2.0 - By Sagrini (2010)\n");
Lo pongo de presentacion jeje, era un programa de concurso ;) para que quedase bonito :P aunque gracias por el detallito ;D
¿Qué es exactamente lo que quieres enviar a otro proceso (datos, notificación de eventos...)?
Si quieres comunicar dos procesos que están en el mismo PC, bajo mi punto de vista, usar sockets es lo más largo y pesado. Utilizaria pipes, signals... dependiendo de lo que quieras enviar claro.
Si no quieres usar sockets siempre te quedan las pipes, pero bueno...
Pipes (http://tldp.org/LDP/lpg/node11.html)
Suerte!