• STATISTIQUES
  • Il y a eu un total de 0 membres et 54457 visiteurs sur le site dans les dernières 24h pour un total de 54 457 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Comment ca marche
     Gratuit et accessible à tous, ce site de communauté permet de se dépanner, se faire aider ...
    Webmaster
    [FR] Secuser
    Actualité de la sécurité informatique, fiches virus et hoax, alertes par email, antivirus gratui...
    Hacking
    [FR] NewbieContest
    Nous vous proposons une série de challenges regroupant plusieurs domaines allant de l'exploitation de fail...
    Hacking
    [EN] HackQuest
    Logic: 12, JavaScript: 14, Applet: 6, CrackIt: 13, Crypto: 11, Internet: 3, Exploit: 7, Stegano: 12, Flash: 1, Programmi...
    Challenges
    [EN] Astalavista
    Un site aux ressources incontournable depuis plusieurs années, Astalavista est réellement devenue un cl...
    Hacking
    [FR] InfoMirmo
    Apprentissage de l'informatique par l'intermédiaire de challenges de sécurité. Venez app...
    Hacking
    [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation

  • 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 101 21-05-2014, 22h27
Dernier message: fr0g
  [C-AIDE] Fuzzer De Programme sakiir 2 214 16-05-2013, 11h21
Dernier message: Sh4dows
  [C] Un mini-serveur HTTP -Moloch- 11 642 19-04-2013, 14h22
Dernier message: notfound
  [C] Programme de hashage Junky 1 257 23-03-2013, 12h11
Dernier message: Junky
  [C] Socket Client-Serveur -> Write() + Read() sakiir 7 447 18-03-2013, 07h19
Dernier message: sakiir
  [C] Serveur multi-clients Creepy_p0ney 12 610 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