Ayuda a crear chat cliente servidor con sockets en lenguaje c

Iniciado por Yukth, Septiembre 27, 2014, 12:31:38 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 27, 2014, 12:31:38 PM Ultima modificación: Septiembre 27, 2014, 12:34:09 PM por Expermicid
hola, mu buenas tardes , tengo este codigo y quiero hacer apartir de el un chat, por ahora que solo se conecte con el servidor y hable con el , pero no se porque en la parte del cliente se queda pegado en el while de la funcion recv y ninguno de los dos recive los mensajes enviados,espero de puedan ayudar . aqui el codigo. es echo para windows.
CLIENTE
Código: c
 #include <stdio.h>
#include <stdlib.h>
#include <windows.h>

char SendBuff[512],RecvBuff[512]="";

int main(int argc, char *argv[]){
 
  WSADATA wsaData;
  SOCKET conn_socket;
  struct sockaddr_in server;
  struct hostent *hp;
  int resp;
  //Inicializamos la DLL de sockets
  resp=WSAStartup(MAKEWORD(2,0),&wsaData);
  if(resp){
    printf("Error al inicializar socket\n");
    getchar();return -1;
  }

  //Obtenemos la IP del servidor... en este caso
  // localhost indica nuestra propia máquina...
  hp=(struct hostent *)gethostbyname("localhost");

  if(!hp){
    printf("No se ha encontrado servidor...\n");
    getchar();WSACleanup();return WSAGetLastError();
  }

  // Creamos el socket...
  conn_socket=socket(AF_INET,SOCK_STREAM, 0);
  if(conn_socket==INVALID_SOCKET) {
    printf("Error al crear socket\n");
    getchar();WSACleanup();return WSAGetLastError();
  }
   
  memset(&server, 0, sizeof(server)) ;
  memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
  server.sin_family = hp->h_addrtype;
  server.sin_port = htons(6000);

  // Nos conectamos con el servidor...

    if(connect(conn_socket,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR){
    printf("Fallo al conectarse con el servidor\n");
    closesocket(conn_socket);
    WSACleanup();getchar();return WSAGetLastError();
  }
  printf("Conexión establecida con: %s\n", inet_ntoa(server.sin_addr));
while(1){
  char cadena[50];
  char *p; 
  printf("enviando mensaje \n");         
  p = gets(cadena);
  printf("Datos eniados: %s \n", p);
  strcpy(SendBuff,p);
  printf("Datos eniados2: %s \n", SendBuff);
  send(conn_socket,SendBuff,sizeof(SendBuff),0);
  printf("Recibiendo Mensaje... \n");
  recv(conn_socket,RecvBuff, sizeof(RecvBuff), 0);
  printf("Datos recibidos: %s \n", RecvBuff);
}

getchar();

 
  // Cerramos el socket y liberamos la DLL de sockets
  closesocket(conn_socket);
  WSACleanup();
  return EXIT_SUCCESS;
}
 


SERVIDOR

Código: c
#include <stdio.h>
#include <windows.h>

char SendBuff[512],RecvBuff[512];

int main(int argc, char *argv[]){

  WSADATA wsaData;
  SOCKET conn_socket,comm_socket;
  SOCKET comunicacion;
  struct sockaddr_in server;
  struct sockaddr_in client;
  struct hostent *hp;
  int resp,stsize;
char mensaje[512];
  //Inicializamos la DLL de sockets
  resp=WSAStartup(MAKEWORD(2,0),&wsaData);
  if(resp){
    printf("Error al inicializar socket\n");
    getchar();return resp;
  }
 
  //Obtenemos la IP que usará nuestro servidor...
  // en este caso localhost indica nuestra propia máquina...
  hp=(struct hostent *)gethostbyname("localhost");

  if(!hp){
    printf("No se ha encontrado servidor...\n");
    getchar();WSACleanup();return WSAGetLastError();
  }

  // Creamos el socket...
  conn_socket=socket(AF_INET,SOCK_STREAM, 0);
  if(conn_socket==INVALID_SOCKET) {
    printf("Error al crear socket\n");
    getchar();WSACleanup();return WSAGetLastError();
  }
 
  memset(&server, 0, sizeof(server)) ;
  memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
  server.sin_family = hp->h_addrtype;
  server.sin_port = htons(6000);

  // Asociamos ip y puerto al socket
  resp=bind(conn_socket, (struct sockaddr *)&server, sizeof(server));
  if(resp==SOCKET_ERROR){
    printf("Error al asociar puerto e ip al socket\n");
    closesocket(conn_socket);WSACleanup();
    getchar();return WSAGetLastError();
  }

  if(listen(conn_socket, 1)==SOCKET_ERROR){
    printf("Error al habilitar conexiones entrantes\n");
    closesocket(conn_socket);WSACleanup();
    getchar();return WSAGetLastError();
  }
             
  // Aceptamos conexiones entrantes

  printf("Esperando conexiones entrantes... \n");
  stsize=sizeof(struct sockaddr);
  comm_socket=accept(conn_socket,(struct sockaddr *)&client,&stsize);
  if(comm_socket==INVALID_SOCKET){
    printf("Error al aceptar conexión entrante\n");
    closesocket(conn_socket);WSACleanup();
    getchar();return WSAGetLastError();
  }
  printf("Conexión entrante desde: %s\n", inet_ntoa(client.sin_addr));

  while(1){
  char cadena[50];
  char *p;
  printf("enviando mensaje \n");         
  p = gets(cadena);
  printf("Datos io: %s \n", p);
  strcpy(SendBuff,p);
  send(conn_socket,SendBuff,sizeof(SendBuff),0);
  printf("Datos enviados: %s \n", SendBuff);
  recv(conn_socket,RecvBuff, sizeof(RecvBuff), 0);
  printf("Datos recibidos: %s \n", RecvBuff);
}
  getchar();           

  // Cerramos el socket de la comunicacion
  closesocket(comm_socket);
 
  // Cerramos liberia winsock
  WSACleanup();
  return (EXIT_SUCCESS);
}