
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!
#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


0