Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1199 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Socket dans une dll

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Socket dans une dll

n°808220
kundun59
Posté le 28-07-2004 à 08:11:32  profilanswer
 

Bonjour a tous,
 
Je cherche a faire communiquer une application Java avec une application Authorware.
Authorware ne communique pas directement avc l'exterieur mais peux utiliser des DLL. J'ai donc pense a faire un serveur cote Java et un client dans une DLL en C.
 
J'ai donc fait une application console qui lit bien ce qu'envoi mon serveur. Le probleme c'est que la meme fonction place dans une dll ne compile pas du tout.
 
Le contenu du fichier principal de la dll est ceci:
 
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
 
#pragma comment(lib,"ws_32.lib" )
 
#define EXPORT
 
void EXPORT readJava(char buffer2[255])
{
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2,0),&WSAData);
 SOCKET sock;
 SOCKADDR_IN sin;
 
 char *buffer=new char[0];
 int check_recv=1;
 int count=0;
 int check_connect=0;
 int n_array=0;
 int i;
 
 sock=socket(AF_INET,SOCK_STREAM,0);
   
 sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
 sin.sin_family = AF_INET;
 sin.sin_port = htons(1234);
 
 while((check_connect=connect(sock,(SOCKADDR *)&sin,sizeof(sin)))==-1 && count <10)
 { count++; }
 
 if (check_connect==0)
 {  
  while(check_recv>0)  
  {  
   check_recv=recv(sock,buffer,sizeof(buffer),0);
   if (check_recv>0)  
   {  
    for(i=0;i<check_recv;i++)
    {
     buffer2[i+n_array]=buffer[i];
    }
    n_array=n_array+check_recv;
   }
  }
 }
 
 for(i=n_array;i<=255;i++)
 {
  buffer2[i]=NULL;
 }
 
 closesocket(sock);
 WSACleanup();
 
 return;
}
 
Je cherche simplement a savoir comment faire fonctioner cette fonction dans une dll. Ou si vous avez une autre solution au probleme Java-Authorware, je prend ausi.
 
D'avance merci
 
Baptiste

mood
Publicité
Posté le 28-07-2004 à 08:11:32  profilanswer
 

n°808238
SoWhatIn22
Posté le 28-07-2004 à 08:46:16  profilanswer
 

"ne compile pas": c'est à dire? soit un peu plus précis quand même, sans quoi on ne peut pas t'aider. au pire donne les messages d'erreur du compilo...

n°808387
kundun59
Posté le 28-07-2004 à 10:41:32  profilanswer
 

C' est a dire qu'il y a des erreurs a la compilation de la dll qui n'apparaissaient pas a la compilation de l'executable.
 
Si on utilise winsock.h, la premiere erreur est trouvee dans winsock.h:
illegal use of SOCKET
 
Si on utilise winsock2.h, la premiere erreur est trouvee dans winsock2.h:
fd_set struct redefinition
 
En bref ce sont les fichiers appelles qui ne vont pas, mais je ne sais pas quoi utiliser d'autre.

n°808425
SoWhatIn22
Posté le 28-07-2004 à 11:10:05  profilanswer
 

je crois qu'il faut inclure winsok2.h *avant* windows.h

n°808427
blackgodde​ss
vive le troll !
Posté le 28-07-2004 à 11:13:05  profilanswer
 

et si tu vires #include <windows.h> ?
a quoi te sers stdio.h ?
sinon ton truc fuit : tu as un new et pas de delete ...
(d'ailleurs new existe pas en C)


---------------
-( BlackGoddess )-
n°808448
kundun59
Posté le 28-07-2004 à 11:29:58  profilanswer
 

J'ai recopie une bonne partie du code sur internet, d'ou la presence du new. Accessoirement, ca fonctionnait tres bien avec l'executable, et ca ne fonctionne pas sans le new.
 
Le <stdio.h> me servait dans mes tests, j'ai juste oublier de l'enlever.
 
Si j'enleve le <windows.h>, les erreurs obtenues avec <winsock2.h> se changent pour devenir celles obtenues avec <winsock.h>. Pas de changement avec <winsock.h>, toujours le probleme de Socket.

n°808482
blackgodde​ss
vive le troll !
Posté le 28-07-2004 à 11:47:40  profilanswer
 

chez moi ca compile pas (bcp d'erreurs) avec  
#include <windows.h>  
#include <winsock2.h>  
(en .exe comme en .dll)
 
et ca compile avec
#include <winsock2.h>  
(en .exe comme en .dll encore)
 
(vc++7.1)
 
Accessoirement new reste qd mm du C++ et pas du C, et accessoirement tu as toujours une fuite


Message édité par blackgoddess le 28-07-2004 à 11:47:58

---------------
-( BlackGoddess )-
n°808662
kundun59
Posté le 28-07-2004 à 13:52:04  profilanswer
 

J'ai reessaye, et effectivement ca ne compile pas avec #include <windows.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib" )  
 
en .exe, mais ca compile avec
#include <windows.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib" )  
 
ou avec:
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib" )  
 
milles pardons
 
Mais ca ne compile toujours pas en dll.
J'utilise une version 6 de Visual C++.
 
Pourrais tu m'envoyer les fichiers dll a cette adresse stp
b.dusautoir.NOSPAM.@free.fr
sans le .NOSPAM.
 
Pour la fuite, j'ai tente de la colmater, mais apres avoir vide mon tableau de char, mon "delete buffer" n'est pas accepte. A moins qu'il y ait une commande speciale.
 
J'avais trouve l'aide sur les socket a cette adresse
www.developpez.com/c/WalrusSock.html
Ca me semblait serieux, et je ne vois pas de trace de delete.

n°808734
blackgodde​ss
vive le troll !
Posté le 28-07-2004 à 15:04:32  profilanswer
 

oui mais non, un new [] sans delete [] ca fuit ... puis je comprends pas comment ca s'execute avec  
char *buffer=new char[0];
ecrit
char buffer [1024]; par exemple a la place
 
sinon l'exemple sur developpez.com fuit.
 
 
    for(i=0;i<check_recv;i++)  
    {  
     buffer2[i+n_array]=buffer[i];  
    }  
 
=> utilises memcpy
 
et d'ailleurs pourquoi tu passes pas directement buffer2 en paramètre de recv ?
 
si tu veux que je te compile une dll, je mets pas __stdcall en standard d'appel ?


---------------
-( BlackGoddess )-
n°808784
kundun59
Posté le 28-07-2004 à 15:54:02  profilanswer
 

Bonne nouvelle, il n'y a plus de new, donc plus de fuites.
Il a ete remplace par un  
char buffer[4];
 
MAis c'est la seule bonne nouvelle.
 
Je ne peux pas utiliser memcpy, et buffer2 directement en receveur car, le buffer ne peux recevoir que 4 characteres, je ne sais pas pourquoi, peut etre parcque le serveur est en Java. Donc je lit mes 4 characteres, les stocks dans buffer, et concatene buffer a buffer2.
Je n'ai pas utilise la fonction concat() car avec un pointeur en entree il m'a pose probleme. Et j'ai besoin d'un pointeur pour recuperer mes donnees a la sortie.
 
Je pensais n'avoir besoin que du fichier .c de la dll.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Socket dans une dll

 

Sujets relatifs
[Application Center Test] Qu'est ce qu'une socket error ?[Perl] probleme de socket bloquant
[Servlet Java] [Php] [Socket] Circulation des données Java <-> PhpErreur http 400 et socket
[Socket] Répondre à une requête HTTPSocket et Java
C# - Secruité socketpb transfert fichier -socket VC++6
Erreur de process et socket[C#][Socket] Connexion asynchrone
Plus de sujets relatifs à : Socket dans une dll


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR