
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 : 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;

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

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)