Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DrKillador

#31
No estoy intentando enviar el archivo, sino un string con texto, mira te copio el codigo completo del cliente.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#include <string.h>
#include <conio.h>

#define MAXBUFLEN 2048
#define PORT 4950

char SendBuff[MAXBUFLEN]="";

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(1,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(argv[1]);

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

 // Creamos el socket...
 conn_socket=socket(AF_INET,SOCK_DGRAM, 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(PORT);
   //vemos el numero de elementos del fichero
   FILE *pFichero;
   pFichero=fopen(argv[2], "r");
   int x=0;
   while (!feof(pFichero))
   {
       fgetc(pFichero);
       x++;
   }
   fclose(pFichero);

   printf("%d\n",x);

   //recuperar archivo
   char sc2[x];
   pFichero=fopen(argv[2], "r");
   while (!feof(pFichero))
   {
       sprintf(sc2,"%s%c",sc2,fgetc(pFichero));
   }
   fclose(pFichero);

   resp=sendto(conn_socket,
               sc2,
               strlen(sc2),
               0,
               (struct sockaddr *)&server,
               sizeof(struct sockaddr)
             );
   if(resp==SOCKET_ERROR){
       printf("Error al enviar datos...\n");
       closesocket(conn_socket);WSACleanup();
       getchar();return WSAGetLastError();
   }

 // Visualizamos resultado...
 printf("Enviados %d bytes hacia %s\n",resp,inet_ntoa(server.sin_addr));
 getchar();

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

Gracias!
#32
Gracias a ambos por las ideas, efectivamente amchacon el caracter nulo se lo incluía.

Hice los cambios que me recomendaste naderST (no sé si correctamente), pero sigo teniendo el problema:

FILE *pFichero;

//Comprobamos el tamano del fichero para establecer el tamano del buffer
char sc[MAXBUFLEN]="";
pFichero=fopen(PathFichero, "r");
int cont=0;  
while (!feof(pFichero))
{
fgetc(pFichero);
cont++;
}
fclose(pFichero);  

//Leemos la conversacion desde el fichero y la guardamos en un buffer que tiene el tamano igual al numero de elementos que leeremos del fichero
char sc2[cont]="";
pFichero=fopen(PathFichero, "r");    
while (!feof(pFichero))    
{        
sprintf(sc2,"%s%c",sc2,fgetc(pFichero));          
}
fclose(pFichero);  

//Enviamos la conversacion    
resp=sendto(conn_socket,                
sc2,                
strlen(sc2),                
0,                
(struct sockaddr *)&server,                
sizeof(struct sockaddr)              
);


Saludos
#33
Hola! estoy haciendo una practica de la facultad en la que tengo que programar un sencillo msn/chat con sockets en C. Para ello, tengo una conversaciones en un fichero de texto, que tengo que leer y enviar a un servidor que está esperando.

Pero tengo un problema, si pongo el texto de la conversacion "a fuego" en una variable y la envio, todo va bien:

char *sc="hola!";
    resp=sendto(conn_socket,
                sc,
                strlen(sc),
                0,
                (struct sockaddr *)&server,
                sizeof(struct sockaddr)
              );


Pero si primero leo el texto del archivo, y despues lo envio, se me produce un error en el servidor. Creo que es porque en el caso anterior creo la variable cadena del tamaño exacto a los datos que envío, y en el otro, creo una cadena de tamaño grande (MAXBUFLEN) y despues le agrego los datos, y claro, debe haber basura al final de la cadena. ¿Como podria solucionarlo?

char sc[MAXBUFLEN]="";
    FILE *pFichero;
    pFichero=fopen(PathFichero, "rb");
    int x=0;
    while (!feof(pFichero))
    {
        sprintf(sc,"%s%c",sc,fgetc(pFichero));
        x++;
    }
    sc[x-1]='\0';
    fclose(pFichero);
    //Comprobamos que se haya leido bien el fichero
    printf("[%s]",sc);
    //Enviamos la conversacion
    resp=sendto(conn_socket,
                sc,
                strlen(sc),
                0,
                (struct sockaddr *)&server,
                sizeof(struct sockaddr)
              );


Gracias!
#34
El problema parece que viene por el handle, pq sí le pongo una cadena a pelo en la cabecera de la llamada a ReadAndHandleOutput()  sí q avanza...

Ideas?
#35
Hi! Les comento un problema a ver si pueden ayudarme.

He programado una shell en C para Win, que me permite ejecutar comandos. Para ello utilizo las 2 siguientes funciones:

char* ReadAndHandleOutput(HANDLE hPipeRead)
{
   char lpBuffer[256]="";
   DWORD nBytesRead;
   char *partialResult;
   char result[10000]="";
   while(1)
   {
       if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !nBytesRead)
       {
           if (GetLastError() == ERROR_BROKEN_PIPE)
               break; // pipe done - normal exit path.
       }
       partialResult = (char *) malloc(10000);
       strncpy(partialResult,lpBuffer,nBytesRead);
       sprintf(result,"%s%s",result,partialResult);
   }
   return result;
}

char* executeCommand(char *argument)
{
   SECURITY_ATTRIBUTES sa;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;

   void * leer;
   void * escribir;

   ZeroMemory(&sa,sizeof(&sa));

   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
   sa.bInheritHandle = TRUE;
   sa.lpSecurityDescriptor = NULL;

   CreatePipe(&leer,&escribir,&sa,0);

   GetStartupInfoA(&si);

   si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
   si.wShowWindow = SW_HIDE;
   si.hStdOutput = escribir;
   si.hStdError  = escribir;
   si.hStdInput = leer;

   CreateProcess(0,argument,0,0,TRUE,0,NULL,NULL,&si,&pi);

   CloseHandle(escribir);

   return ReadAndHandleOutput(leer);
}


La shell me funciona perfectamente en Windows Vista y 7 (tanto en 32 como en 64bits), pero en XP (32bits) el programa se me queda pillado en la siguiente instrucción:

if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !nBytesRead)

No consigo dar con el error por el que en XP se queda pillado en ese punto del código, porque el programa no se para, sigue funcionando sin hacer nada...

Por si les sirve el dato, he probado a escribir en un fichero un dato justo antes del IF ese que da el problema y despues, y el fichero lo deja pillado, porque no llega a la instruccion de cierre (logicamente).

La lectura la hago sincrona, poniendo la ultima variable de la llamada a ReadFile a NULL, asi que no veo donde puede estar el problema :/

Cualquier ayuda se la agradezco, que ando perdiendo mucho tiempo con esto

saludoss
#36
Programación C/C++ / Re: Listar directorio en c
7 Febrero 2013, 13:18 PM
Arreglado, era el * efectivamente. Ya podéis cerrar el hilo, muchas gracias!
#37
Programación C/C++ / Re: Listar directorio en c
7 Febrero 2013, 11:55 AM
A ver si me pueden ayudar, he programado el siguiente codigo para listar todos los archivos y subcarpetas de una carpeta, pero me muestra UN SOLO archivo de la carpeta, el primero concretamente.

Saben que me puede estar fallando? Gracias a to2

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>

int main()
{
   WIN32_FIND_DATA findFileData;
   HANDLE hFind;

   hFind = FindFirstFile(".", &findFileData);

   if(hFind==INVALID_HANDLE_VALUE)
   {
       printf("La carpeta no existe o no se puede acceder");
   }
   else
   {
       do
       {
           if(findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
           {
               printf("Dir %s",findFileData.cFileName);
           }
           else
           {
               printf("%s\n",findFileData.cFileName);
           }
       }while(FindNextFile(hFind,&findFileData)!=0);

       FindClose(hFind);
   }

   return 0;
}
#38
Programación C/C++ / Re: Listar directorio en c
7 Febrero 2013, 08:35 AM
Gracias @amchacon, una pregunta del código, en el IF situado dentro del WHILE, si la sentencia es verdadera intenta hacer recursividad, llamando de nuevo a la función listarDirectorio, pero a esta función se le pasan 2 argumentos, cuando en realidad solo admite uno por cabecera:

listarDirectorio(Buffer,Nuevo);
void listarDirectorio(string Cosa)

¿Está bien así?
#39
Programación C/C++ / Re: Listar directorio en c
6 Febrero 2013, 14:29 PM
Gracias! Se me olvido ponerlo, sorry bro, es para windows  :rolleyes:
#40
Programación C/C++ / Listar directorio en c
6 Febrero 2013, 13:53 PM
Hola amigos,

Saben como puedo hacer para listar un dir en C? y devolver una list con los archivos y subcarpetas que contenga el directorio?

Graxx  :D