Problemas con una nueva conexion

Hola experto, espero que puedas ayudarme con este problemita que te detallo enseguida:
tengo este codigo del servidor.
#include <winsock.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
void main(void) {
char *ip;
hostent *thisHost;
SOCKET m_socket,AcceptSocket;
sockaddr_in service,new_connect;
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
{printf("Error en WSAStartup()\n");exit(1);}
thisHost = gethostbyname("");
ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);
printf("\n\rIP del Servidor: %s:35015\n\n\r",ip);
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET ) {
printf( "Error en socket(): %ld\n", WSAGetLastError() );
WSACleanup();
exit(1);
}
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( ip );
service.sin_port = htons( 35015 );
memset(&(service.sin_zero), '\0', 8);
if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR ) {
printf("%d bind() fallo.\r\n",WSAGetLastError());closesocket(m_socket);getchar();exit(1);}
if ( listen( m_socket, 10 ) == SOCKET_ERROR )
printf( "Error escuchando socket.\n");
while(1){
int x=0;
ncl=sizeof(new_connect);
AcceptSocket=SOCKET_ERROR;
printf( "\nEsperando conexion de cliente...\n\r" );
while(AcceptSocket== SOCKET_ERROR )
{
AcceptSocket = accept( m_socket,(struct sockaddr *)&new_connect,(int *)&ncl);
printf("\r%u %u %d",x++,AcceptSocket,WSAGetLastError());
}
printf( "\n\rConexion Establecida-> Cliente Conectado.\n");
m_socket = AcceptSocket;
int bytesSent;
int bytesRecv;
char cad_env[1024],cad_rec[1024];
while(1) {
cad_rec[0]=NULL;
printf( "\n\rEsperando Mensaje.");
bytesRecv = recv(m_socket,(char far *)cad_rec,1024,0);
cad_rec[bytesRecv]='\0';
if(!strcmp(_strupr(cad_rec),"EXIT")||strlen(cad_rec)==0) break;
printf("\rMensaje Recibido: %s %d", cad_rec,strlen(cad_rec));
cad_env[0]=NULL;
printf("\n Enviar Mensaje: " );gets(cad_env);
strcat(cad_env,"\r\n");
bytesSent = send( m_socket,cad_env, strlen(cad_env), 0 );
}
printf("\r\nCliente desconectado");
}
closesocket(m_socket);WSACleanup();
printf( "\n\rTerminando Conexion.\n");
}
el asunto es que cuando se inicia la primera conexion con el cliente funciona sin problemas, pero cuando el cliente termina la conexion con un EXIT el servidor vuelve a ACCEPT para esperar otra conexion, es en este punto donde se presentan los problemas (ya no acepta otra conexion) apesar que en el cliente envia el mensaje de que si esta conectado, el codigo de error que arroja es 10022 que dice que hay un error de parametros o como que no hay socket escuchando.
el servidor y el cliente se ejecutan en el misma PC.
gracias por tu tiempo.
probe varias posibilidades y no doy con el problema.
Respuesta
1
Disculpa la demora, pero he estado ocupado en mi trabajo. Si aún te sirve la respuesta ahí va.
El problema es que cuando creas un servidor usas un determinado socket, en tu caso el m_socket, pero cuando aceptas una conexión se crea otro socket, en tu caso el AcceptSocket. Para realizar el intercambio de mensajes con la conexión aceptada debes usar el mismo socket en que la aceptas, es decir el AcceptSocket, el socket de escucha (m_socket) no se debe tocar para poder seguir aceptando conexiones. En otras palabras el error está en la línea:
m_socket = AcceptSocket;
Debes eliminar esta línea y en el ciclo de recepción y envío de mensajes tienes que usar el socket AcceptSocket en vez de m_socket. Cuando el usuario ingrese EXIT debes cerrar este socket.
Te envío una modificación a tu programa con estos cambios, hice otros ajustes fuera de los que expliqué, pero no los consideres si no es necesario.
Espero que te sirva mi respuesta.
#include <winsock.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
void main(void) {
char *ip;
struct hostent *thisHost;
SOCKET m_socket,AcceptSocket;
SOCKADDR_IN service,new_connect;
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
{printf("Error en WSAStartup()\n");exit(1);}
thisHost = gethostbyname("localhost");
ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);
printf("\n\rIP del Servidor: %s:35015\n\n\r",ip);
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET ) {
printf( "Error en socket(): %ld\n", WSAGetLastError() );
WSACleanup();
exit(1);
}
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( ip );
service.sin_port = htons( 35015 );
memset(&(service.sin_zero), '\0', 8);
if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR ) {
printf("%d bind() fallo.\r\n",WSAGetLastError());
closesocket(m_socket);
getchar();
exit(1);
}
if ( listen( m_socket, 10 ) == SOCKET_ERROR ){
printf( "Error escuchando socket.\n");
getchar();exit(1);
}
while(1){
int x=0;
short ncl;
int bytesSent;
int bytesRecv;
char cad_env[1024],cad_rec[1024];
ncl=sizeof(new_connect);
printf( "\nEsperando conexion de cliente...\n\r" );
if ( ( AcceptSocket = accept( m_socket,NULL,NULL) ) == INVALID_SOCKET ){
printf("\r%u %u %d",x++,AcceptSocket,WSAGetLastError());
getchar();
exit(1);
}
printf( "\n\rConexion Establecida-> Cliente Conectado.\n");
while(1) {
cad_rec[0]=0;
printf( "\n\rEsperando Mensaje.");
bytesRecv = recv(AcceptSocket,(char far *)cad_rec,1024,0);
cad_rec[bytesRecv]='\0';
if(!strcmp(_strupr(cad_rec),"EXIT")||strlen(cad_rec)==0){
closesocket(AcceptSocket);
break;
}
printf("\rMensaje Recibido: %s %d", cad_rec,strlen(cad_rec));
cad_env[0]=0;
printf("\n Enviar Mensaje: " );gets(cad_env);
strcat(cad_env,"\r\n");
bytesSent = send( AcceptSocket,cad_env, strlen(cad_env), 0 );
}
printf("\r\nCliente desconectado");
}
closesocket(m_socket);WSACleanup();
printf( "\n\rTerminando Conexion.\n");
}
gracias experto, valio la pena la espera, ya lo probe y si funciona, te estoy incluyendo en mis favoritos, y espero que sigas siendo parte de TODOEXPERTOS.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas