WinSock (reseaux)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Anonyme 2
Messages : 183
Inscription : ven. 18/mars/2011 11:53

WinSock (reseaux)

Message par Anonyme 2 »

Yo, j'aimerais avoir un peu d'aide concernant les fonction winsock qui permette la gestion de paquets reseaux de bas niveau :mrgreen:
Voila un bout de code en C d'un serveur qui attend une connexion d'un client, que j'ai essayer de traduire en purebasic, mais je ne suis pas sur que ca fonctionne correctement... alors j'aimerais vos avis (please un peu d'indulgence envers le debutant que je suis :wink: ):

Code : Tout sélectionner

#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close (s)

typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;

WSADATA wsa_data;
WSAStartup (MAKEWORD (2, 2), &wsa_data)

/* Declaration de 2 structures de type SOCKADDR_IN */
   SOCKADDR_IN sin; /* pour le serveur */
   SOCKADDR_IN csin; /* pour le client */
   int sock_err, recsize;

   FILE* fichier = fopen("log.txt", "a");

   /* ouverture du socket */
   if ( (*sock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
   {
      perror("socket.open");
      return 1; /* Creation du socket a echouer */
   }

   printf ("socket %d est maintenant ouvert en mode TCP/IP\n", *sock);

   sin.sin_addr.s_addr = htonl (INADDR_ANY); /* Pas besoin d'IP */
   sin.sin_port = htons (SERVER_PORT_LISTENING);  /* port d'ecoute */
   sin.sin_family = AF_INET;  /* famille du protocol (IP) */

   /* bind du socket serveur (sock) avec la structure sin du serveur */
   sock_err = bind (*sock, (SOCKADDR *) &sin, sizeof sin);
   if (sock_err == SOCKET_ERROR)
   {
      perror("Error: bind");
      return 1;
   }

   /* ecoute sur le port */
   if ( (sock_err = listen (*sock, 5)) == SOCKET_ERROR)
   {
      perror("Error: listen");
      return 1;
   }
   printf ("ecoute sur le port %d...\n", SERVER_PORT_LISTENING);

   /* attendre et accepter la connection du client en recuperant les infos
      sur le client dans csin, et en créant le socket du client csock */
   recsize = (int) sizeof csin;
   if( (*csock = accept(*sock, (SOCKADDR*) &csin, &recsize)) == INVALID_SOCKET)
   {
      perror("Error: accept");
      return 1;
   }
   printf ("client connecte avec socket: %d    de: %s   port: %d\n",
               *csock,    inet_ntoa (csin.sin_addr)    ,htons (csin.sin_port));

   if(fichier != NULL)
   {
      fputs("-----------------------------------\n", fichier);
      fprintf(fichier, "client connecte avec socket: %d    de: %s   port: %d\n",
               *csock,    inet_ntoa (csin.sin_addr)    ,htons (csin.sin_port));
      fputs("-----------------------------------\n", fichier);

      fclose(fichier);
   }

   return 0;
Et voila mon ptit code purebasic (ne faites pas attention aux lignes de codes en commentaires :| ):

Code : Tout sélectionner

;-Debut
EnableExplicit
Structure IpHeader ;-Structure de l'entête IP
  version.a
  tos.a
  totalLength.w
  ID.w
  flagOffset.w
  ttl.a
  protocol.a
  checkSum.w
  source.l
  destination.l
EndStructure
Structure TcpHeader ;-Structure de l'entête TCP
  sourcePort.w
  destinationPort.w
  sequenceNumber.l
  acknowledgeNumber.l
  dataOffset.a
  flags.a
  windows.w
  checkSum.w
  pointer.w
EndStructure
#SIO_RCVALL=$98000001
If OpenConsole() ;-Console principale
  ConsoleTitle("Deimon [Tool - Sniffer local]")
  ConsoleColor(12,0)  
  ;Declaration des variables
  Global ipNet.l, wsa.WSADATA, socket.l, sin.SOCKADDR_IN, csin.SOCKADDR_IN, INADDR_ANY, promiscuous_mode.l=1, *buffer, bufferSize.i, ip.IPHeader, tcp.TcpHeader, dat.s
  Global received.i, sourcePort.u, destinationPort.u, ipSource.s, ipDestination.s, ipCheckSum, ipId, ipTTL, ipVersion, ipflagOffset, tcpSequenceNumber, tcpCheckSum, tcpDataOffset, tcpFlag, tcpPointer
  Global protocole$, bind, connexion$, ioctlsocket, send, connect, listen, accept, reception, o
  InitNetwork() ;-Initialisation du réseau
  If WSAStartup_($202, @wsa)
    PrintN("Impossible d'acceder au réseau!")
    PrintN("Appuyez sur une touche pour quitter...")
    Input()
    End
  EndIf
  ;socket=SOCKET_(#AF_INET, #SOCK_RAW, #IPPROTO_IP) ;-Creation du socket
  socket=SOCKET_(#AF_INET, #SOCK_STREAM, #IPPROTO_IP) ;Socket de flux (stream) pour send_() et recv_() et accept_() et connect_()
  ;socket=SOCKET_(#AF_INET, #SOCK_DGRAM, #IPPROTO_IP) ;Socket de paquet (datagram) pour sendto_() et recvfrom_()
  If socket=#INVALID_SOCKET
    WSACleanup_()
    PrintN("Impossible de créer le socket!")
    PrintN("Appuyez sur une touche pour quitter...")
    Input()
    End
  EndIf  
  ;ICI les structures associées au socket
  ;ExamineIPAddresses()
  ;ipNet=NextIPAddress() ;Notre addresse ip  
  ;ipNet=MakeIPAddress(*,*,*,*) ;Addresse ip
  sin\sin_family=#AF_INET ;-Famille du paquet: #AF_INET: constante   
  sin\sin_addr=htonl_(INADDR_ANY)
  ;sin\sin_addr=inet_addr_() ;-Addresse ip à mettre ici!
  sin\sin_port=htons_(40002) ;-Port (si=0 alors choix automatique)
  bind=bind_(socket, @sin, SizeOf(SOCKADDR_IN)) ;-Associe notre addresse locale (dans la strucure) à la socket
  If bind=#SOCKET_ERROR
    WSACleanup_()
    PrintN("Ecoute impossible!")
    PrintN("Appuyez sur une touche pour quitter...")
    Input()
    End
  EndIf  
  ;ioctlsocket=ioctlsocket_(socket, #SIO_RCVALL, @promiscuous_mode) ;-Passage en mode promiscuous en mettant argp=1
  ;If ioctlsocket=#SOCKET_ERROR
    ;WSACleanup_()
    ;PrintN("Impossible de passer en mode promiscuous!")
    ;PrintN("Appuyez sur une touche pour quitter...")
    ;Input()
    ;End
  ;EndIf 
  ;connect=connect_(socket, @sin, SizeOf(SOCKADDR_IN)) ;-Connexion à ipNet
  ;If connect=#SOCKET_ERROR
    ;WSACleanup_() 
    ;PrintN("Connexion échouée!")
    ;PrintN("Appuyez sur une touche pour quitter...")
    ;Input()
    ;End
  ;Else
    ;PrintN("Connexion établie!")
    ;Input()
  ;EndIf 
  listen=99  
  Repeat
  listen=listen_(socket, 5) ;-Attente d'une connexion
  If listen=#SOCKET_ERROR
    WSACleanup_()
    PrintN("Impossible de passer en mode ecoute!")
    PrintN("Appuyez sur une touche pour quitter...")
    Input()
    End
  Else
    PrintN("En attente d'une connexion...")
  EndIf 
  Until listen=0 
  ;bufferSize=10000 ;Taille de l'allocation
  ;*buffer=AllocateMemory(bufferSize) ;-Allocation de la mémoire pour la reception de données
  Repeat
    ;accept=accept_(socket, @sin, SizeOf(SOCKADDR_IN)) ;-Acceptation de la connexion
    accept=accept_(socket, @csin, SizeOf(SOCKADDR_IN))
    If accept=#SOCKET_ERROR
      ;WSACleanup_()
      ;PrintN("Acceptation impossible!")
      ;PrintN("Appuyez sur une touche pour quitter...")
      ;Input()
      ;End    
    Else    
      PrintN("Connexion accépté!")
      PrintN(""+Str(accept))
      Input()
    EndIf
    ;PrintN("IP: "+Str(inet_ntoa_(csin\sin_addr)))
    ;PrintN("Port: "+Str(htons_(csin\sin_port)))    
    ;-Reception de données
    ;received=recv_(accept, *buffer, bufferSize, 0) ;-Reception de données avec socket raw
    ;If received<>#SOCKET_ERROR
      ;PrintN("Données recues!")
      ;PrintN(PeekS(*Buffer))
      ;dat=Space(received-SizeOf(IpHeader)-SizeOf(TcpHeader))
      ;CopyMemory(*buffer, @ip, SizeOf(IpHeader)) ;-Entêtes/couche IP
      ;CopyMemory(*buffer+SizeOf(IpHeader), @tcp, SizeOf(TcpHeader)) ;-Entêtes/couche TCP
      ;CopyMemory(*buffer+SizeOf(IpHeader)+SizeOf(TcpHeader), @dat, Len(dat))  ;-Entêtes/couche de données (data)      
      ;If ip\protocol=6 ;Protocole TCP
        ;protocole$="Type de paquet: TCP"
      ;ElseIf ip\protocol=2 ;-Protocole IGMP
        ;protocole$="Type de paquet: IGMP"
      ;ElseIf ip\protocol=1 ;-Protocole ICMP
        ;protocole$="Type de paquet: ICMP"
      ;ElseIf ip\protocol=17 ;-Protocole UDP
        ;protocole$="Type de paquet: UDP"
      ;EndIf           
      ;sourcePort=ntohs_(tcp\sourcePort) ;-Port de la source
      ;destinationPort=ntohs_(tcp\destinationPort) ;-Port du destinataire
      ;ipSource=IPString(ip\source) ;-L'ip de la source
      ;ipDestination=IPString(ip\destination) ;-L'ip de du destinataire
      ;ipCheckSum=ntohs_(ip\checkSum)
      ;ipId=ntohs_(ip\ID)
      ;ipTTL=ntohs_(ip\ttl)
      ;ipVersion=ntohs_(ip\version)
      ;ipflagOffset=ntohs_(ip\flagOffset)
      ;tcpSequenceNumber=ntohs_(tcp\sequenceNumber)
      ;tcpPointer=ntohs_(tcp\pointer)
      ;tcpCheckSum=ntohs_(tcp\checkSum)
      ;tcpFlag=ntohs_(tcp\flags)
      ;tcpDataOffset=ntohs_(tcp\dataOffset)
      ;PrintN("---------------------------")
      ;PrintN("        RECEPTION")
      ;PrintN("         Infos:") 
      ;PrintN("Protocole: "+protocole$)
      ;PrintN("IpCheckSum: "+Str(ipCheckSum))
      ;PrintN("IpId: "+Str(ipId))
      ;PrintN("IpTTL: "+Str(ipTTL))
      ;PrintN("IpVersion"+Str(ipVersion))
      ;PrintN("IpFlagOffSet: "+Str(ipflagOffset))
      ;PrintN("TcpSequenceNumber: "+Str(tcpSequenceNumber))
      ;PrintN("TcpPointer: "+Str(tcpPointer))
      ;PrintN("TcpCheckSum: "+Str(tcpCheckSum))
      ;PrintN("TcpFlag: "+Str(tcpFlag))
      ;PrintN("TcpDataOffSet: "+Str(tcpDataOffset))
      ;PrintN(ipSource+" ----> "+ipDestination) 
      ;PrintN("Ports: "+Str(sourcePort)+"       "+Str(destinationPort))
      ;PrintN("Taille: "+Str(MemorySize(*Buffer)))
      ;PrintN("        DONNEES: ")
      ;PrintN(dat)
      ;PrintN("---------------------------")
    ;EndIf
    ;-Fin de reception de données
    ;-Envois de données
    ;send=sendto_(socket, *buffer, bufferSize, 0, @sin, SizeOf(SOCKADDR_IN)) ;Pas besoin de connect_(), avec socket datagram
    ;send=send_(socket, *buffer, bufferSize, 0) ;Besoin de connect_(), avec socket stream    
    ;If send>0
      ;PrintN("---------------------------")
      ;PrintN("          ENVOIS")      
      ;PrintN("")
      ;PrintN("192.168.0.44 ----> "+IPString(ipNet))
      ;PrintN("Ports:       "+Str(sin\sin_port))
      ;PrintN("Taille: "+Str(MemorySize(*Buffer)))
      ;PrintN("        DONNEES: ")
      ;PrintN(PeekS(*Buffer))
      ;PrintN("---------------------------")
      ;Input()
    ;Else
      ;PrintN("Envois echoue!")
      ;Input()
    ;EndIf  
    ;-Fin d'envois de données
  ForEver  
  closesocket_(socket) ;Fermeture du socket
  ;shutdown_(socket, 2)
  WSACleanup_()  
EndIf
;-Fin
Si vous avez besoin des codes clients faites moi signe! :mrgreen:
Merci d'avance pour votre aide, je galère un peu bcp la! :cry:
PS: j'avoue que je me suis base sur quelques codes du forum (notemment sur selui d'un de mes posts)