Socket dans une dll

Socket dans une dll - C - Programmation

Marsh Posté le 28-07-2004 à 08:11:32    

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

Reply

Marsh Posté le 28-07-2004 à 08:11:32   

Reply

Marsh Posté le 28-07-2004 à 08:46:16    

"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...

Reply

Marsh Posté le 28-07-2004 à 10:41:32    

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.

Reply

Marsh Posté le 28-07-2004 à 11:10:05    

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

Reply

Marsh Posté le 28-07-2004 à 11:13:05    

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 )-
Reply

Marsh Posté le 28-07-2004 à 11:29:58    

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.

Reply

Marsh Posté le 28-07-2004 à 11:47:40    

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 )-
Reply

Marsh Posté le 28-07-2004 à 13:52:04    

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.

Reply

Marsh Posté le 28-07-2004 à 15:04:32    

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 )-
Reply

Marsh Posté le 28-07-2004 à 15:54:02    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed