IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PureBasic Discussion :

API WinSock (réseaux)


Sujet :

PureBasic

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut API WinSock (réseaux)
    Yo, j'aimerais avoir un peu d'aide concernant les fonction winsock qui permette la gestion de paquets reseaux de bas niveau
    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 ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
     
     
    ;-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!
    Merci d'avance pour votre aide, je galère un peu bcp la!
    PS: j'avoue que je me suis base sur quelques codes du forum (notemment sur selui d'un de mes posts)

  2. #2
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 261
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 261
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    ça pourra peut-être t'inspirer, ça a l'air de ressembler à ce que tu cherches à faire

    www.purebasic.fr/english/viewtopic.php?f=13&t=47933
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut
    Merci de ton lien, c'est effectivement en rapport avec ce que je cherche, donc je continue à farfouiller du coté de ces posts, et si je trouve quelque chose je vous envois le lien (bien qu'il n'y a pas autant de fan de reseau que ca :/ )

Discussions similaires

  1. API winsock WSAIsBlocking
    Par chuko dans le forum Réseau
    Réponses: 3
    Dernier message: 21/09/2008, 14h32
  2. API pour réseaux de neurones
    Par Mucho dans le forum Méthodes prédictives
    Réponses: 4
    Dernier message: 21/07/2008, 14h59
  3. Bean ou API pour construire des réseaux
    Par mabdylon dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 22/12/2007, 14h49
  4. [VB.net] Procédures réseaux (ancien Winsock)
    Par ShortcutZ dans le forum VB.NET
    Réponses: 1
    Dernier message: 26/03/2007, 04h17
  5. API réseau multi plates-formes style Wininet/Winsock
    Par jmmolina dans le forum Développement
    Réponses: 6
    Dernier message: 22/10/2003, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo