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.
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 de himeneo
1