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:
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
Os dejo el código que tengo y un resumen del problema:
Código (c) [Seleccionar]
#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;
}
Código [Seleccionar]
$ 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)
Código [Seleccionar]
$ 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