• Domingo 28 de Abril de 2024, 22:29

Autor Tema:  Sockets cliente y servidor  (Leído 2528 veces)

nistel88

  • Visitante
Sockets cliente y servidor
« en: Lunes 28 de Diciembre de 2009, 12:48 »
0
Hola,
en la universidad me pidieron hace un proyecto que envie un archivo de la aplicacion del cliente hasta el servidor usando sockets.
Esta es la form del cliente:

HOST      |______________|                                  3 TEdits: IP servidor, Puerto y el nombre del usuario
PORT      |______________|
NOMBRE  |______________|

CONNECTAR     DESCONNECTAR                             Botones para conectarse y desconectarse del servidor

|_________________________|                            Otro TEdit antes de enviar el archivo me sirvio para enviar un texto/frase

ENVIAR TEXT             ENVIAR ARXIU                       2 botones mas uno para enviar texto (me sirvio para enviar textos/frases) y el boton de envio de archivos

Tambien hay el TClientSocket, que no sabia como dibujarlo  :lol:

Y el codigo:
Código: C++
  1.  
  2. #include <vcl.h>
  3. #pragma hdrstop
  4.  
  5. #include "stdio.h"
  6. #include "Client.h"
  7.  
  8. #define BLOCK 1024
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma resource "*.dfm"
  12. TPCClient *PCClient;
  13. char *Buffer[BLOCK];
  14. //---------------------------------------------------------------------------
  15. __fastcall TPCClient::TPCClient(TComponent* Owner)
  16.         : TForm(Owner)
  17. {
  18. }
  19. //---------------------------------------------------------------------------
  20. void __fastcall TPCClient::Creacio(TObject *Sender)
  21. {
  22.         TextEnviar->Enabled = false;
  23.         EnviarText->Enabled = false;
  24.         EnviarArxiu->Enabled = false;
  25.         Desconnectar->Enabled = false;
  26. }
  27. //---------------------------------------------------------------------------
  28. void __fastcall TPCClient::ConnectarClick(TObject *Sender)
  29. {
  30.  
  31.         ClientSocket1->Host = String(IPHost->Text);
  32.         ClientSocket1->Port = StrToInt(NumPort->Text);
  33.         ClientSocket1->Active = true;
  34.         TextEnviar->Enabled = true;
  35.         EnviarText->Enabled = true;
  36.         EnviarArxiu->Enabled = true;
  37.         IPHost->Enabled = false;
  38.         NumPort->Enabled = false;
  39.         NomUsuari->Enabled = false;
  40.         Connectar->Enabled = false;
  41.         Desconnectar->Enabled = true;
  42.         ShowMessage ("Connectat correctament");
  43. }
  44. //---------------------------------------------------------------------------
  45.  
  46. void __fastcall TPCClient::DesconnectarClick(TObject *Sender)
  47. {
  48.         TextEnviar->Enabled = false;
  49.         EnviarText->Enabled = false;
  50.         EnviarArxiu->Enabled = false;
  51.         IPHost->Enabled = true;
  52.         NumPort->Enabled = true;
  53.         NomUsuari->Enabled = true;
  54.         Desconnectar->Enabled = false;
  55.         Connectar->Enabled = true;
  56.         ShowMessage ("Desconnectat correctament");
  57. }
  58. //---------------------------------------------------------------------------
  59.  
  60. void __fastcall TPCClient::EnviarTextClick(TObject *Sender)
  61. {
  62.         if (TextEnviar->Text.IsEmpty()) return;
  63.         String  strToSend = NomUsuari->Text + " : " + TextEnviar->Text;
  64.         ClientSocket1->Socket->SendText(strToSend);
  65.         this->TextEnviar->Text = "";
  66.  
  67. }
  68. //---------------------------------------------------------------------------
  69. void __fastcall TPCClient::ApretarTecla(TObject *Sender, char &Key)
  70. {
  71.         if(Key == VK_RETURN) EnviarTextClick(this);
  72. }
  73. //---------------------------------------------------------------------------
  74.  
  75. void __fastcall TPCClient::ClientSocket1Error(TObject *Sender,
  76.       TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
  77. {
  78.         //ShowMessage("Error en l'enviament");
  79.         //ErrorCode = 0;
  80. }  
  81. //---------------------------------------------------------------------------
  82. long TPCClient::TamanyArxiu(FILE *fitxer)
  83. {
  84.         long actual, longitud;
  85.  
  86.         actual = ftell(fitxer);
  87.         fseek(fitxer, 0L, SEEK_END);
  88.         longitud = ftell(fitxer);
  89.         fseek(fitxer, actual, SEEK_SET);
  90.         return longitud;
  91. }
  92. //---------------------------------------------------------------------------
  93. void __fastcall TPCClient::EnviarArxiuClick(TObject *Sender)
  94. {
  95.         //if (TextEnviar->Text.IsEmpty()) return;
  96.  
  97.         FILE *Arxiu = fopen("C:UsersAdminanillo.jpg", "rb");
  98.         long longarxiu = TamanyArxiu(Arxiu);
  99.         //ClientSocket1->Socket->SendText("ARXIU PER ENVIAR");
  100.         ClientSocket1->Socket->SendText(longarxiu);
  101.  
  102.         int i = 0, llegir = 0;
  103.  
  104.         while (i < longarxiu) {
  105.                 llegir = fread (Buffer, 1024, 1, Arxiu);
  106.                 ClientSocket1->Socket->SendBuf(Buffer, llegir);
  107.                 i = i+llegir;
  108.         }
  109.  
  110.         fclose (Arxiu);
  111.  
  112.         ShowMessage ("Arxiu enviat");
  113.         //ClientSocket1->Socket->SendText("ARXIU ENVIAT");
  114.         //this->TextEnviar->Text = "";
  115. }
  116.  

Mediante los 3 TEdits y los botones "Connectar" y "Desconnectar", se conecta y desconecta del servidor. Como ya he dicho el objetivo es enviar un archivo del cliente al servidor. Me dijeron que tenia que dividir el archivo en bloques, guardarlos en un buffer mientras el servidor los recibia del buffer y es lo que intento hacer.

Para esto, cuando esta conectado y pulsas el boton "Enviar arxiu" deberia abrir el archivo en modo lectura binaria, calcular el tamaño del archivo con la funcion "TamanyArxiu" y enviarlo al servidor (para que sepa cuantas partes tiene que recibir) y, finalmente, empezar a enviar los bloques del archivo al buffer para que pueda recibirlos el servidor.

Mi problema esta cuando ejecuto el programa, se conecta bien pero cuando le doy al boton para enviar el archivo me lanza la excepcion de abajo cuando entra en la funcion "TamanyArxiu" (la funcion que calcula el tamaño del archivo)

Debugger Exception Notification
Project ProjecteClient.exe raised exception class EAccessViolation with message 'Acces violation at address 32665A50 in module 'CC3260MT.DLL'. Read of address F8D08534'. Process stopped. Use Step or Run to continue.

Espero que puedan ayudarme
Gracias de antemano

cundy2010

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Sockets cliente y servidor
« Respuesta #1 en: Martes 23 de Marzo de 2010, 14:13 »
0
Tu problema estoy 100 % seguro es el siguiente, tu función que calcula el tamaño está bien lo que no debe estar bien es la ruta que le pones a la función fopen. Seguro que esa es la ruta de la imagen ????, no lo creo, la función fopen debe estar devolviendo NULL, tracea el programa y comprúebalo por tí mismo. Espero te haya sido de ayuda.