• STATISTIQUES
  • Il y a eu un total de 3 membres et 14509 visiteurs sur le site dans les dernières 24h pour un total de 14 512 personnes!


    2 membres se sont inscrits dans les dernières 24h!


    Membres: 2 447
    Discussions: 3 590
    Messages: 32 838
    Tutoriels: 77
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Le site du zero
    Découvrez gratuitement la programmation (C, C++, PHP, MySQL, XHTML, CSS...), Linux, le Mapping, la modé...
    Programmation
    [FR] apprendre-a-manipuler
    Site d'apprentissage de la manipulation d'autrui.
    Hacking
    [EN] Exploit-db
    Une base de données d'exploits triés par genre (GHDB, Remote, Local, Web, DOS, ShellCode) à ...
    Vulnérabilités
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [EN] Astalavista
    Un site aux ressources incontournable depuis plusieurs années, Astalavista est réellement devenue un cl...
    Hacking
    [EN] social-engineer
    Site dédié au Social Engineering en général.
    Hacking
    [EN] Lost-chall
    Site de challenge présenté sous la forme de différente saison. Pour passer une saison vous devez avoir accumulÃ...
    Challenges

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