• STATISTIQUES
  • Il y a eu un total de 0 membres et 5048 visiteurs sur le site dans les dernières 24h pour un total de 5 048 personnes!
    Membres: 2 459
    Discussions: 3 572
    Messages: 32 818
    Tutoriels: 77
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Cyber-Hacker
    CH - Cyber Hacker est un jeu par navigateur de simulation de hack, programmez et envoyez vos virus et piratez les aut...
    Hacking
    [EN] hax.tor
    50 level de challenges mélangés
    Challenges
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [EN] Rosecode
    Programming: 36, Math: 29, Probability: 5, Sequence: 7, Crypto: 4, Brainf**k: 13, TimeRace: 4, Hack: 9
    Challenges
    [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation
    [EN] Sabre Films
    Site de challenge présenté sous la forme d'une quête. Vous êtes un détective et devrez résoudre d...
    Challenges
    [FR] µContest
    µContest est un site de challenges de programmation, c'est à dire qu'il propose des épreu...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] Programme Serveur/Client
10-10-2012, 15h28 (Modification du message : 19-11-2012, 19h25 par InstinctHack.)
Message : #1
Creepy_p0ney Hors ligne
chef des poneys voodoo
*



Messages : 146
Sujets : 9
Points: 24
Inscription : Dec 2011
[C] Programme Serveur/Client
Salut,j'ai donc réusi à programmer mon serveur multi clients, mais le problème se pose pour le client car en effet, mon clients fonctionne quand je me connecte au serveur (qui est sur mon linux) avec le client(qui est sur mon linux) le truc c'est que quand je me connecte avec mon client sous win ça ne fonctionne pas!! (il envoie les données mais ne les reçoit pas).

voici le code de mon srv
Code :
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
typedef struct
{
   int sock;
   char name[64];
}Client;
int main(){
    
    
    int reals;
    int sin_size;
    int sockfd;
    struct sockaddr_in their_addr[5];
    int i=0;
    int ret=0;
    char buf[64];
    char msg[64];
    int k=0;
    int m=0;
    int max=0;
    Client clients[5];
    fd_set fd;
    struct sockaddr *addr;
    char *log="tim";
    struct sockaddr_in my_addr;
    pid_t pid;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
        perror("socket");
        exit(1);
    }
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(2300);
    my_addr.sin_addr.s_addr=INADDR_ANY;
    
    if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr_in))<0){
        perror("bind");
        exit(1);
    }
    listen(sockfd,5);
    printf("attente d'un client");
    sin_size = sizeof(struct sockaddr_in);
    printf("%d\n",i);
    while(1){
        int l=0;
        int n=0;
        FD_ZERO(&fd);
        FD_SET(sockfd,&fd);
        for(l=0;l<i;l++){
            FD_SET(clients[l].sock,&fd);
        }
        printf("nous y sommes3\n");
        for(n=0;n<i;n++){
            if(max<clients[n].sock){
                max=clients[n].sock;
            }
        }
        if(max<sockfd)
            max=sockfd;
        printf("%d",max);
        if((ret=select(max+1,&fd,NULL,NULL,NULL))==-1){
            perror("select");
            exit(1);
        }
        printf("nous y sommes2\n");
        if(FD_ISSET(sockfd,&fd)){
            printf("here we are\n");
            sin_size=sizeof(struct sockaddr_in);
            clients[i].sock=accept(sockfd,(struct sockaddr *)&their_addr[i],&sin_size);
            send(clients[i].sock,"login :",64,0);
            reals=recv(clients[i].sock,buf,64,0);
            buf[reals]='\0';
            strncpy(clients[i].name, buf, 64 - 1);            
            i++;

        }
        else if(ret==0){
            printf("problem?");
        }
        else{
            printf("here we are9");
            for(k=0;k<i;k++){
                if(FD_ISSET(clients[k].sock,&fd)){
                    int j=0;
                    printf("here we are5\n");
                    reals=recv(clients[k].sock,buf,64,0);
                    printf("here we are6\n");
                    if(reals==0){
                        close(clients[k].sock);
                        i--;
                    }
                    else{
                        buf[reals]='\0';
                        printf("%s",buf);
                        printf("here we are7\n");
                        strncpy(msg,clients[k].name,64-1);
                        strncat(msg,buf,64-strlen(msg)-1);
                        printf("here we are8\n");
                        for(j=0;j<i;j++){
                            send(clients[j].sock,msg,64,0);
                        }
                    }
                }
            }
        }

    }        
        


    
}

celui de mon client win :
Code :
#if defined (WIN32)
    #include <winsock2.h>

#elif defined (linux)
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>

#endif

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>



int main(){
#if defined (WIN32)
        WSADATA WSAData;
        int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
    #else
        int erreur = 0;
    #endif

    struct sockaddr_in my_addr;
    int sockfd;
    
    char buffer[64];
    char *buf;
    int reals=0;
    fd_set fd;
    sockfd=socket(AF_INET,SOCK_STREAM,0);

    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(2300);
    my_addr.sin_addr.s_addr=inet_addr("192.168.1.12");
    connect(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));

    while(1){

        FD_ZERO(&fd);
        FD_SET(STDIN_FILENO, &fd);
        FD_SET(sockfd,&fd);
        select(sockfd+1,&fd,NULL,NULL,NULL);

         if(FD_ISSET(STDIN_FILENO, &fd))
              {

                 fgets(buffer, 64 - 1, stdin);
                 {
                        char *p = NULL;
                        p = strstr(buffer, "\n");
                       if(p != NULL)
                    {
                               *p = 0;
                        }
                        else
                           {
                              /* fclean */
                                   buffer[64- 1] = 0;
                            }
                }
                send(sockfd,buffer,64,0);
                 }
            else {
                reals=recv(sockfd,buf,64,0);
                if(reals==0){
                    printf("mother fucking problem!!!");
                }
                puts(buf);
            }
        }




    #if defined (WIN32)
        WSACleanup();
    #endif

    return EXIT_SUCCESS;



}
Penser que coder est coder explique-t-il la recursion ?
http://p0neyland.wordpress.com/
+1 (0) -1 (0) Répondre
13-10-2012, 14h13
Message : #2
Creepy_p0ney Hors ligne
chef des poneys voodoo
*



Messages : 146
Sujets : 9
Points: 24
Inscription : Dec 2011
RE: an other thing about sockets
Ok donc après une bonne aide de super snail j'en suis ici :
Code :
#include <sys/types.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    typedef struct
    {
      int sock;
      char name[64];
    }Client;
    int main(int argc, char** argv){


      int reals;
      int sin_size;
      int sockfd;
      struct sockaddr_in their_addr[5];
      int i=0;
      int ret=0;
      char buf[64];
      char msg[64];
      int k=0;
      int m=0;
      int max=0;
      Client clients[5];
      fd_set fd;
      struct sockaddr *addr;
      char *log="tim";
      struct sockaddr_in my_addr;
      pid_t pid;
      if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
        perror("socket");
        exit(1);
      }
      my_addr.sin_family=AF_INET;
      my_addr.sin_port=htons(atoi(argv[1]));
      my_addr.sin_addr.s_addr=INADDR_ANY;

      if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr_in))<0){
        perror("bind");
        exit(1);
      }
      listen(sockfd,5);
      printf("attente d'un client");
      sin_size = sizeof(struct sockaddr_in);
      printf("%d\n",i);
      while(1){
        int l=0;
        int n=0;
        FD_ZERO(&fd);
        FD_SET(sockfd,&fd);
        for(l=0;l<i;l++){
          FD_SET(clients[l].sock,&fd);
        }
        printf("nous y sommes3\n");
        for(n=0;n<i;n++){
          if(max<clients[n].sock){
            max=clients[n].sock;
          }
        }
        if(max<sockfd)
          max=sockfd;
        printf("Socket %d\n",max);
        if((ret=select(max+1,&fd,NULL,NULL,NULL))==-1){
          perror("select");
          exit(1);
        }
        // On regarde si le dernier socket a des données
        if(FD_ISSET(sockfd,&fd)){
          printf("here we are\n");
          sin_size=sizeof(struct sockaddr_in);
          clients[i].sock=accept(sockfd,(struct sockaddr *)&their_addr[i],&sin_size);
          send(clients[i].sock,"login :",8,0);
          reals=recv(clients[i].sock,buf,64,0);
          buf[reals]='\0';
          strncpy(clients[i].name, buf, 64 - 1);
          printf("%s", buf);
          i++;

        }
        else if(ret==0){
          printf("problem?");
        }
        else{
          // Le dernier socket n'a pas de données, on regarde les autres
          for(k=0;k<i;k++){
            if(FD_ISSET(clients[k].sock,&fd)){
              // Données présentes
              int j=0;
              reals=recv(clients[k].sock,buf,64,0);

              // Code foireux de fermeture de socket (condition jamais vraie,
              // et que se passe-t-il si le premier client ferme ?)
              if(reals==0){
                close(clients[k].sock);
                i--;
              }
              else{
                buf[reals]='\0';
                printf("%s",buf);
                memset(msg, 0, 64);
                strncpy(msg,clients[k].name,64-1);
                strncat(msg,buf,64-strlen(msg)-1);
                // envoi des données à tous les clients
                for(j=0;j<i;j++){
                  send(clients[j].sock,msg,64,0);
                }
              }
            }
          }
        }

      }




    }
pour le serveur et ici pour le client :
Code :
#if defined (WIN32)
    #include <winsock2.h>
        
    #elif defined (linux)
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
        
    #endif
        
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
        
        
        
    int main(int argc, char** argv){
    #if defined (WIN32)
      WSADATA WSAData;
      int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
    #else
      int erreur = 0;
    #endif
        
      struct sockaddr_in my_addr;
      int sockfd;
      char buffer[64];
      char buf[64];
      int reals=0;
      int ret=0;
      fd_set fd;
      sockfd=socket(AF_INET,SOCK_STREAM,0);
        
      my_addr.sin_family=AF_INET;
      my_addr.sin_port=htons(2300);
      my_addr.sin_addr.s_addr=inet_addr("192.168.1.12");
      printf("%d",connect(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)));
    
      while(1){
      
        FD_ZERO(&fd);
        FD_SET(sockfd,&fd);
        if(select(sockfd+1, &fd, NULL, NULL, NULL) == -1){
          printf("Select failed on socket I/O");
          return -1;
        }
      
        if(FD_ISSET(sockfd, &fd)) {
          reals=recv(sockfd,buf,64,0);
          if(reals==0){
            printf("mother fucking problem!!!");
          }
          printf("%s",buf);
        }
      
        fgets(buffer, 64 - 1, stdin);
        {    
               char *p = NULL;
                p = strstr(buffer, "\n");
                if(p != NULL)
               {
                       *p = 0;
                }
                else
                {
                   /* fclean */
                       buffer[64- 1] = 0;
                }
    }
    send(sockfd,buffer,64,0);
      }
qui marche chez supersnail mais pas chez moi
Penser que coder est coder explique-t-il la recursion ?
http://p0neyland.wordpress.com/
+1 (0) -1 (0) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  [C] serveur irc (non terminé) fr0g 0 1,640 21-05-2014, 22h27
Dernier message: fr0g
  [C-AIDE] Fuzzer De Programme sakiir 2 2,559 16-05-2013, 11h21
Dernier message: Sh4dows
  [C] Un mini-serveur HTTP -Moloch- 11 7,586 19-04-2013, 14h22
Dernier message: notfound
  [C] Programme de hashage Junky 1 2,413 23-03-2013, 12h11
Dernier message: Junky
  [C] Socket Client-Serveur -> Write() + Read() sakiir 7 4,462 18-03-2013, 07h19
Dernier message: sakiir
  [C] Serveur multi-clients Creepy_p0ney 12 8,865 09-10-2012, 19h28
Dernier message: Creepy_p0ney

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut