Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Dealer098

#1
Programación C/C++ / Re: ¿Socket cerrado?
22 Diciembre 2011, 14:03 PM
La primera idea ya la he puesto en práctica, pero nada. La segunda es demasiado enrevesada para lo que quiero hacer, pero gracias.

Os dejo el código que tengo y un resumen del problema:

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int sockfd, newsock;

int main (int argc, char *argv [])
{
printf ("Code 0.1 - Dealer 2011\n");
if (argc != 2) { printf ("Use: %s <port>\n\n", argv [0]); return 1; }

int cont = 0;
struct sockaddr_in client, host;
char buffer [1024];
int size=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, (struct sockaddr*)&host, sizeof (struct sockaddr));
listen (sockfd, 1);

while (1)
{
newsock=accept (sockfd, (struct sockaddr*)&client, &size);
printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));

while (cont != -1)
{
time_t now=time (0);
struct tm *ahora;
ahora=localtime ((const time_t*)&now);
strftime (buffer, 1024, "%d/%m/%Y %H:%M:%S \n" , ahora);
buffer [strlen (buffer)] = 0;
cont=send (newsock, &buffer, strlen (buffer), 0);
sleep (1);
}

printf ("Finishing connection from %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
close (newsock);
}
close (sockfd);
return 0;
}


$ gcc -o serv serv.c
$ ./serv 31337
Code 0.1 - Dealer 2011
Got connection from 127.0.0.1:48677
$
$ gdb -q serv
Leyendo símbolos desde /home/juanra/Escritorio/serv...(no se encontraron símbolos de depuración)hecho.
(gdb) r 31337
Starting program: /home/juanra/Escritorio/serv 31337
Code 0.1 - Dealer 2011
Got connection from 127.0.0.1:48678

Program received signal SIGPIPE, Broken pipe.
0x0012d422 in __kernel_vsyscall ()
(gdb)


$ nc -vv 127.0.0.1 31337
Connection to 127.0.0.1 31337 port [tcp/*] succeeded!
22/12/2011 13:57:09
22/12/2011 13:57:10
22/12/2011 13:57:11
22/12/2011 13:57:12
22/12/2011 13:57:13
^C
$ nc -vv 127.0.0.1 31337
Connection to 127.0.0.1 31337 port [tcp/*] succeeded!
22/12/2011 13:57:33
22/12/2011 13:57:34
22/12/2011 13:57:35
22/12/2011 13:57:36
^C
$

A ver: El primer code es el código del servidor. El segundo es la terminal desde la que se ejecuta code. El tercero muestra los procesos de netcat, que se conecta al servidor corriendo en la segunda terminal, y que tras pocos segundos recibe una interrupción ^C para interrumpir la conexión. En el momento de la interrupción, la idea es que la segunda terminal (la del servidor) mostrase un mensaje diciendo que la conexión se ha finalizado. Ahora, el problema es que al cortar desde netcat la conexión, hay un error que nos muestra el GDB al correr el servidor desde el depurador. Dice que el error es por "broken pipe". Tras varias pruebas, he visto que el "error" se producía cuando se cortaba la conexión y la ejecución del programa llega a la revisión del while. ¿Por qué? ¿Alguna idea?
PS: Evidentemente, los dos programas (servidor y nc) corren a la vez. Un saludo. Dealer
#2
Programación C/C++ / ¿Socket cerrado?
20 Diciembre 2011, 23:20 PM
¡Buenas de nuevo! Estaba haciendo probaturas con sockets en C, Linux, y se me ha ocurrido una pregunta.
¿Cómo puedo detectar que el cliente/host ha perdido la conexión? Pongo un ejemplo: Tengo un programa que se conecta a cierta IP con cierto puerto. Ahora, al conectarse, recibe datos del servidor. Si corto la conexión de este programa, ¿cómo puedo hacer que el servidor "reaccione"? Hay que tener en cuenta que el programa no envía datos, sólo recibe. ¿Qué se os ocurre?

Un saludo. Dealer.
#3
Cita de: versams en 22 Noviembre 2011, 18:29 PM
Soy un novato en esto de la programación y después de leerme guias y cosas, me han propuesto crear (programar) algo, he pensado en esto del IVA (si es muy complejo para un principiante decidmelo porfavor)
Pues eso, me gustaria que me recomendarais alguna guia más para principiantes (podeis tratarme como nivel 0) y algun consejo o paso a seguir para empezar en esto.
PD: El programa que he de usar para la programación del mismo es: "Dev- C++"

Bueno, pues para empezar, para calcular el 18% de una cantidad no hace falta tener una guía. Segundo, infravalorarte no va a hacer que la gente diga "Ohh, que modesto! Vamos a ayudarle!". Una cosa es ser humilde y otra es infravalorarse a sí mismo. Tercero, considero que a programar se aprende programando, así que te dejo un código rápido y tú miras cómo funciona. Cuarto, lo siento pero lo voy a hacer en C, pero no creo tengas problemas a la hora de pasarlo a C++. Quinto, Dev-C++ utiliza gcc, así que puedes compilar el programa con gcc, no necesariamente con Dev-C++. Sexto, deja de usar Dev-C++. Es horrible.


#include <stdio.h>

int main ()
{
printf ("Introduzca un numero entero: ");
float a; scanf ("%f", &a); a=a*1.18;
printf ("El numero introducido +IVA es %f.\n\n", a);
return 0;
}



$ gcc -o code code.c
$ ./code
Introduzca un numero entero: 12
El numero introducido +IVA es 14.1600000.

$


A partir de esto, puedes mejorarlo haciendo una función para esta tarea, pasando el entero por los argumentos de main... Hasta aquí la teoría, ahora toca poner en juego la creatividad. Un saludo. Dealer.
#4
Programación C/C++ / Comenzando...
20 Diciembre 2011, 21:23 PM
Buenas noches! Para comenzar mi participación en este foro, les dejo esta función que hice el otro día en casita:


int fctrs (int n, int x [])
{
int a = n, i=1, cont=0;
x [cont] = 1; cont++;

for (i=2; i < n; i++)
while (a%i == 0) { a=a/i; x [cont] = i; cont++; }
x [cont] = 0;
return cont;
}


N es un entero a descomponer en números primos. X [] es un vector en el que se almacenan los factores primos de N. Devuelve un número entero que corresponde al número de factores primos que tiene este número. Es poco, pero llevo un tiempo sin programar absolutamente nada, y voy poco a poco. Además, hasta que los Reyes me traigan un pendrive nuevo no voy a poder programar al 100% :P (uso Guadalinex, y para algunas cosas necesito root :/).
Un saludo. Dealer.