Visual C++ .NET - uso de sockets???

   
Vista:

uso de sockets???

Publicado por diana (13 intervenciones) el 12/09/2007 20:01:30
hola, tengo una aplicacion la cual hace uso d sockets, esta fue migrada de lunux, ahora en windows ya corre., y segun esos si me crea el socket pero al querer mandr o leerlo desde otra PC no pasa nada, en ambos equipos client ey server tengo XP SP2, mi codigo es el siguiente:
#include <stdio.h>
#include <sys/types.h>
//#include <sys/utsname.h>
#include <time.h>
//#include <sys/socket.h>
//#include <sys/un.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <semaphore.h>
#include <string.h>
#include "ws2tcpip.h"
#include <Af_irda.h>
#include "../include/socket_server.h"
#include "../include/linklist.h"
#include "../ANSWER.H"
#include "../include/pointers.h"

extern sem_t *pSemUpdateDone;
void send_msg(int iSockFileHandle, char* msg)
{
printf("Voy a mandar el siguiente mensaje: %s\n",msg);
send( iSockFileHandle, msg,strlen(msg), 254);//write
}
void fMonth(int iMonth, char *sMonth){
switch (iMonth){
case 0: strcpy(sMonth,"ENE"); break;
case 1: strcpy(sMonth,"FEB"); break;
case 2: strcpy(sMonth,"MAR"); break;
case 3: strcpy(sMonth,"ABR"); break;
case 4: strcpy(sMonth,"MAY"); break;
case 5: strcpy(sMonth,"JUN"); break;
case 6: strcpy(sMonth,"JUL"); break;
case 7: strcpy(sMonth,"AGO"); break;
case 8: strcpy(sMonth,"SEP"); break;
case 9: strcpy(sMonth,"OCT"); break;
case 10: strcpy(sMonth,"NOV"); break;
case 11: strcpy(sMonth,"DIC"); break;
}
}
int parse_msg(char* i_msg, char* o_msg, int nsfd)
{
int ret;
//***********************************************************************************
//MODIFICACION : AGREGAR VARIABLES
int iBitacora;
//FILE *fBitacoraLog;
time_t tm_SecTime;
struct tm *tm_FullTime;
char sTime[10];
char sOldFile[100] = "C:\\informatel\\logs\\bitacora.log",
sNewFile[100]= "C:\\informatel\\logs\\",
sSendFile[50] = "bitacora",
sMonth[6];
//FIN MODIFICACION
//************************************************************************************
iBitacora = 0;
switch ( i_msg[0] )
{
case '1':
//**************MODIFICACION*********************************
iBitacora = 0;
strcpy( o_msg, i_msg);
send_msg(nsfd, o_msg);
//************FIN MODIFICACION*******************************
if ( (!strncmp(&i_msg[2], "1:0:", 4)) || (!strncmp(&i_msg[2], "0:1:", 4)) )
ret = start_system_update(TOTAL_UPDATE);
else
switch ( i_msg[2] )
{
case '0':
ret = start_system_update(SERVICES_UPDATE);
break;
case '1':
ret = start_system_update(CARROUSELS_UPDATE);
break;
}
//printf("ESTE ES EL CODIGO DE ACTUALIZACIONES");
break;
/*--------------MODIFICACION PARA ACTUALIZACION PARCIAL Y BITACORA------------------*/
case '4':
iBitacora = 0;
MuestraStatus("Iniciando actualizacion parcial....");
strcpy( o_msg, i_msg);
send_msg(nsfd, o_msg);
ret = start_system_update(TOTAL_UPDATE);
break;
case '3':
MuestraStatus("\nMensaje reconocido para bitacoras...\n");
iBitacora = 1;
printf("\niBitacora = %d\n",iBitacora);
time(&tm_SecTime);
tm_FullTime = localtime(&tm_SecTime);
fMonth(tm_FullTime->tm_mon,sMonth);
sprintf(sTime,"%d%s%d_%d%d%d%s",tm_FullTime->tm_mday,sMonth,(tm_FullTime->tm_year+1900),tm_FullTime->tm_hour,tm_FullTime->tm_min,tm_FullTime->tm_sec,".log");
printf("\nel tiempo es: %s\n",sTime);
strcat(sSendFile,sTime);
printf("\nel Sendfile es: %s\n",sSendFile);
strcat(sNewFile,sSendFile);
printf("\nel archivo que voy a renombrar es: %s\n",sNewFile);
MuestraStatus("\nRenombrando .. \n");
rename(sOldFile,sNewFile);
MuestraStatus("\nYa lo renombre ...!!!\n///////////////////////////////////\n");
printf("\nvoy a copiar la cadena sSendFile: %s",sSendFile);
strcpy( o_msg,sSendFile);
printf("\nya copie la cadena o_msg: %s\n",o_msg);
ret = 0;
send_msg(nsfd, o_msg);
break;
default : printf("mensaje no reconocido: %c",i_msg[0]);
break;
}
/*-------------------------FIN DE MODIFICACION---------------------------------------*/
// strcpy( o_msg, i_msg);
return( ret );
}
void receive_msg(int iSockFileHandle, char* msg)
{
memset( msg, 0, strlen(msg));
recv( iSockFileHandle, msg, 255,0);//read
printf("Socket Message = %s\n", msg);
}
void socket_server_thread()
{
int sfd, nsfd;
struct sockaddr_in ser_addr, cli_addr;
int cli_addr_len;
char in_msg[255];
char out_msg[255];
int on = 1;

int last_state, last_type;

/**
** Enable deferred cancellation
**/
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &last_state);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &last_type);

/**
** Open a Connection Oriented socket of AF_INET family
**/
if ( ( sfd = socket( AF_INET, SOCK_STREAM, 0) ) == -1 )
{
MuestraStatus("Error openning socket....");
return;
}

/*
* Turn off bind address checking, and allow port numbers to be reused,
* otherwise the TIME_WAIT phenomenon will prevent binding to these
* address.port combinations for (2*MSL) seconds.
*/
if ( ( setsockopt( sfd, SOL_SOCKET, SO_REUSEADDR,
(const char*)&on, sizeof(on)) ) == -1 )
{
MuestraStatus("Error with SO_REUSEADDR....");
return;
}

/*
* When connection is closed, there is a need to linger to ensure
* all data is transmitted, so turn this on also
*/
{
struct linger linger = { 0 };

linger.l_onoff = 1;
linger.l_linger = 30;
if ( ( setsockopt( sfd,
SOL_SOCKET,
SO_LINGER,
(const char*)&linger,
sizeof(linger))) == -1 )
{
printf("Error with SO_LINGER....");
return;
}
}


/**
** Server Address Broadcast
**/
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = inet_addr( TCP_SOCKET_SERVER_ADDRESS );
ser_addr.sin_port = htons( TCP_SOCKET_SERVER_PORT );
if ( bind( sfd, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) == -1 )
{
MuestraStatus("Error binding....");
return;
}

/**
** Declaration of a queue with 10 elements for connection requests
**/
listen( sfd, 10);

/**
** Enable asynchronous cancellation
**/
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &last_type);

/**
** Connection requests reading loop
**/
while (1)
{

cli_addr_len = sizeof( cli_addr );

if ( ( nsfd = accept( sfd, (struct sockaddr *)&cli_addr, (socklen_t*)&cli_addr_len) ) == -1 )
{
MuestraStatus("Error accepting....");
return;
}

/**
** Enable deferred cancellation
**/
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &last_type);
MuestraStatus("Socket Communication Accepted....\n");

/**
** Receive command by socket
**/
pthread_testcancel();
MuestraStatus("Comunicacion establecida...\nEn espera de recepcion de mensaje...\n");
//for(int k=0;k<20;k++);
receive_msg(nsfd, in_msg);
printf("\nVamos a parsear %s...\n",in_msg);
if (!parse_msg(in_msg, out_msg, nsfd))
{
/**
** Send command response by socket
**/
printf("\nEsto es lo que voy a regresar %s...\n",out_msg);
send_msg( nsfd, out_msg );

/**
** Wait until update is done
**/
if ((out_msg[0] == '1')||(out_msg[0] == '4')){
pthread_testcancel();
MuestraStatus("\nFue actualizacion ...\n");
sem_wait(pSemUpdateDone);
/**
** Start moving of user files from previous directory ("informatel_1/")
** to new directory ("informatel_2/"). Then previous directory gets empty.
** This file moving can be in reverse direction
**/
MuestraStatus("\nApenas va a empezar a copiar los archivos...\n");
copy_prev_to_new_user_files();
MuestraStatus("\nYa termino de copiar los archivos\n");
MuestraStatus("System Update Finished....\n");
pthread_testcancel();
}
}
closesocket( nsfd );
MuestraStatus("\nYa cerre el socket\n");
pthread_testcancel();
}
}

Si funcionaria asi, o en Windows se deben usar otras librerias o funciones??
De antemano muchas gracias por su atencion y apoyo.
Saludos!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:uso de sockets???

Publicado por NeoMitnick (12 intervenciones) el 17/09/2007 06:16:26
A vista rápida miré tu código, los sockets en windows son parecidos a los de unix excepto por qué hay que inicializar la dll encargada de los sockets en windows con WSAStartup , hay otras funciones WSA* que deberías conocer como WSACleanup y WSAGetLastError, para hacer uso de sockets tienes que incluir windows.h ( qué milagro no ? )

Por otro lado vi por ahí que usas threads uff, bueno ahí sí no hay parecido con unix, tendrás que reescribir varias cosillas, te recomiendo para facilitarte un poco si trabajas con threads uses las MFC como AfxBeginThread

Por otro lado observé también #include <signal.h> en tu código, surprise!!! en windows las señales no existen (esto no es del todo cierto, pero mejor olvídate de ellas), al menos no en programas de ventanas... y en programas de consola, poues mmm hay limityantes sólo existen un subconjunto de las señales que existen en unix, por ejemplo la señal INTCONT sí existe, pero por ejemplo SIGUSR1 y SIGUSR2 no... tampoco existe fork en windows por si se te ocurría hacer algo combinando señales y procesos,

En windows en lugar de las señales existen los mensajes a los que reacciona una ventana por ejemplo WM_CLOSE, WM_QUIT, WM_SETFOCUS, etc etc etc y otro largo etc, existiendo la posibilidad de hacer mensajes propios (que atenderá tu aplicación cuando se genere, ya que llegan a la cola de mensajes de la ventana). También existen algo a lo que se le llama control de eventos.

Y como son temas complicados de explicar por foros lo mejor es documentarse así que te recomiendo darle una miarada aquí:

Hilos:
http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vccore/html/_core_Multithreading_Topics.asp

Control de eventos:
http://msdn.microsoft.com/library/SPA/vccore/html/vcconEventHandlingUsingAttributes.asp?frame=true

Para los sockets no te mandaré a la MSDN por que ahí usan CSocket (guácala) y CAnsycSocket (no tan fea, pero igual mala), no uses CSocket o
CAnsycSocket de ser posible ya que la primera es realmente fea, ya que sólo soporta sockets síncronos y la otra que encapsula la API de sockets pues la verdad no es muy digerible, mejor usa directamente la API, o crea tu propio envoltorio... mejor date uyna vuelta por esta página que usan los sockets con puro winsock :p

http://www.tenouk.com/cnwinsock2tutorials.html

Ah y el capítulo 2 del libro Programación Avanzada para Win32 de Francisco Javier Ceballos trata los hilos bastante detalladamente con MFC, lo malo es que ya no lo venden, lo econtrarás en una biblioteca :p

Espero haber sido de ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:uso de sockets???

Publicado por Pedro O. (1 intervención) el 17/07/2008 19:27:00
Diana, te consulto. Yo tambien estoy migrando algunas cosas de linux a windows, y tengo la duda con unas funciones que tu has puesto comentadas:

//#include <netinet/in.h>
//#include <arpa/inet.h>

Porque las comentaste?.. Cuales son sus equivalentes en windows.
He compilado mi porgrama en windows y me reclama por esas librerias. nose como obtenerlas para windows..

De antemano gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:uso de sockets???

Publicado por diana estrada (13 intervenciones) el 17/07/2008 19:36:32
hola, pues las comente por el hecho q tu comentas, no me dejaba compilar la aplicacion en .Net 2005, la libreria q utilice para los sockets es la de winsock, no se si puedas ponerme el codigo donde te este marcando fallo despues de q quitas esas librerias q son de linux, para ver q funciones te estan fallando y ver si son de las q yo modifique y pasarte el dato.
Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar