[C con Clase] problema con sockets
nree
p_westermani en hotmail.com
Jue Ene 31 16:32:10 CET 2008
gracias por la respuesta, hice alguno de los cambios y mas o menos tira, ahora el servidor si que es concurrente y escribe los mensajes que le llegan desde los clientes pero mi problema es a la hora de cerrar, cierro el socket entre cliente y servidor pero el cliente se que da medio colgado, no se cierra, el socket esta cerrado y al servidor no llegan tramas pero el cliente no se cierra hasta que se escriben dos frases mas. Ademas si cierro la ventana del cliente la del servidor se queda en blanco y no chuta. Alguna idea???
Aqui va el codigo
servidor.cpp
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#define TAMBUF 1460
#define PORT 1064
#define NUM_CON 5
void tramitarChat(struct sockaddr_in *ss,int *pid)
{
int numbytes;
char buf[TAMBUF];
printf("conexion con proceso %i\n",(int)pid);
while (1)
{
numbytes = recv ((int)ss, buf, sizeof(buf), 0);
if (numbytes < 0)
{
perror("error en la transmision de datos");
}
if (strcmp(buf,"exit") == 0)
{
printf("desconexión de...%i\n", pid);
close((int)ss);
exit(0);
}else
{
buf[numbytes]='\0';
puts(buf);
}
}
}
int main(void) {
int sock;
int sock_dialog;
struct sockaddr_in dir_ser;
struct sockaddr_in dir_cli;
int numbytes;
int yes=1, pid;
socklen_t len;
char buf[TAMBUF];
sock = socket(PF_INET, SOCK_STREAM,0);
if (sock < 0)
{
perror("error de creación de socket");
exit(1);
}
else
{
puts("socket creado...");
}
dir_ser.sin_family = PF_INET;
dir_ser.sin_addr.s_addr = htonl (INADDR_ANY);
dir_ser.sin_port = htons (PORT);
memset(dir_ser.sin_zero, '\0', sizeof dir_ser.sin_zero);
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1)
{
perror("setsockopt");
exit(1);
}
if (bind(sock, (struct sockaddr *)&dir_ser,sizeof dir_ser)< 0)
{
perror("error en la asignación de dirección");
exit(1);
}
else
puts("asignando direccion...");
if (listen (sock, NUM_CON) < 0)
{
perror("error en la escucha");
exit(1);
}else
puts("socket a la escucha...");
while(1)
{
len = sizeof dir_ser;
sock_dialog = accept(sock, (struct sockaddr *) &dir_cli, &len);
printf("server: conexión de %s\n", inet_ntoa(dir_cli.sin_addr));
if (!fork())
{
pid = getpid();
close(sock);
tramitarChat((struct sockaddr_in *)sock_dialog,(int *)pid);
}
close(sock_dialog);
}
return 0;
cliente.cpp
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 1064
#define TAMBUF 1460
int main (int argc, char *argv[])
{
int sock, i;
struct sockaddr_in dir_serv;
char buf[TAMBUF];
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror("No se ha podido crear el socket");
exit (-1);
}else
puts ("socket creado...");
dir_serv.sin_family = PF_INET;
dir_serv.sin_port = htons (PORT);
inet_aton(argv[1], &(dir_serv.sin_addr));
memset(dir_serv.sin_zero, '\0', sizeof dir_serv.sin_zero);
if (connect (sock, (struct sockaddr*)&dir_serv, sizeof dir_serv) <0)
{
perror("conexión no aceptada");
exit(1);
}else
puts("conectando con el servidor...");
while (1)
{
gets(buf);
i= send (sock, buf, sizeof(buf), 0);
if (i < 0)
{
perror("error en la escritura");
exit(1);
}
}
}
Otra cosa, he provado a ejecutar el programa cliente en otro ordenador un ubuntu pero desde vmware y no ha funcionado del todo, se conecta pero a la hora de enviar no llegan las cosas, alguna idea??? y ya para terminar, seria posible tener un cliente en windows y el servidor en linux???
agradezco vuestra sabiduria y paciencia
NEre
Más información sobre la lista de distribución Cconclase