Ver Mensaje Individual
  #6 (permalink)  
Antiguo 12/04/2014, 15:50
Avatar de Drewermerc
Drewermerc
 
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: programacion de sockets en c

Hola a todos.
gracias a todos por responder.
bueno trate de hacer un ejemplo rapido para poder poner en practica los consejos que me diero y bueno segun yo asi queda el codigo si tengo algun error y tambien si hay liberias que tengo que quitar o agrgar para que funcione en windows.
y bueno estos son los codigos.

servidor:
Código C:
Ver original
  1. #define LINUX
  2. #ifdef LINUX
  3.     #include <stdio.h>  
  4.     #include <stdlib.h>      
  5.     #include <sys/types.h>
  6.     #include <winsock2.h>
  7.     #include <netinet/in.h>
  8.  
  9.     #define PORT 3550
  10.     #define BACKLOG 2
  11.  
  12.     main()
  13.     {
  14.  
  15.        int fd, fd2;
  16.  
  17.        struct sockaddr_in server;
  18.        
  19.  
  20.        struct sockaddr_in client;
  21.        
  22.  
  23.        int sin_size;
  24.  
  25.        
  26.        if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {  
  27.           printf("error en socket()\n");
  28.           exit(1);
  29.        }
  30.  
  31.        server.sin_family = AF_INET;        
  32.  
  33.        server.sin_port = htons(PORT);
  34.        
  35.  
  36.        server.sin_addr.s_addr = INADDR_ANY;
  37.        
  38.        if(bind(fd,(struct sockaddr*)&server,
  39.                sizeof(struct sockaddr))==-1) {
  40.           printf("error en bind() \n");
  41.           exit(-1);
  42.        }    
  43.  
  44.        if(listen(fd,BACKLOG) == -1) {  
  45.           printf("error en listen()\n");
  46.           exit(-1);
  47.        }
  48.  
  49.        while(1) {
  50.           sin_size=sizeof(struct sockaddr_in);
  51.          
  52.           if ((fd2 = accept(fd,(struct sockaddr *)&client,
  53.                             &sin_size))==-1) {
  54.              printf("error en accept()\n");
  55.              exit(-1);
  56.           }
  57.  
  58.           printf("Se obtuvo una conexión desde %s\n",
  59.                  inet_ntoa(client.sin_addr) );
  60.          
  61.  
  62.           send(fd2,"Bienvenido a mi servidor.\n",22,0);
  63.          
  64.  
  65.           close(fd2);
  66.        }
  67.    
  68.     }
  69.  
  70.  
  71. #elif WINDOWS
  72.    
  73.     #include <stdio.h>  
  74.     #include <stdlib.h>      
  75.     #include <sys/types.h>
  76.     #include <winsock2.h>
  77.     #include <netinet/in.h>
  78.  
  79.     #define PORT 3550
  80.     #define BACKLOG 2
  81.  
  82.     main()
  83.     {
  84.         WSADATA wsa;
  85.  
  86.         WSAStartup(MAKEWORD(2,2),&wsa);
  87.  
  88.        int fd, fd2;
  89.  
  90.        struct sockaddr_in server;
  91.        
  92.  
  93.        struct sockaddr_in client;
  94.        
  95.  
  96.        int sin_size;
  97.  
  98.        
  99.        if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {  
  100.           printf("error en socket()\n");
  101.           exit(1);
  102.        }
  103.  
  104.        server.sin_family = AF_INET;        
  105.  
  106.        server.sin_port = htons(PORT);
  107.        
  108.  
  109.        server.sin_addr.s_addr = INADDR_ANY;
  110.        
  111.        if(bind(fd,(struct sockaddr*)&server,
  112.                sizeof(struct sockaddr))==-1) {
  113.           printf("error en bind() \n");
  114.           exit(-1);
  115.        }    
  116.  
  117.        if(listen(fd,BACKLOG) == -1) {  
  118.           printf("error en listen()\n");
  119.           exit(-1);
  120.        }
  121.  
  122.        while(1) {
  123.           sin_size=sizeof(struct sockaddr_in);
  124.          
  125.           if ((fd2 = accept(fd,(struct sockaddr *)&client,
  126.                             &sin_size))==-1) {
  127.              printf("error en accept()\n");
  128.              exit(-1);
  129.           }
  130.  
  131.           printf("Se obtuvo una conexión desde %s\n",
  132.                  inet_ntoa(client.sin_addr) );
  133.          
  134.  
  135.           send(fd2,"Bienvenido a mi servidor.\n",22,0);
  136.          
  137.  
  138.           close(fd2);
  139.        }
  140.     WSACleanup();
  141.     }
  142. #endif


cliente:

Código C:
Ver original
  1. #define LINUX
  2. #ifdef LINUX
  3.     #include <stdio.h>
  4.     #include <stdlib.h>
  5.     #include <sys/types.h>
  6.     #include <sys/socket.h>
  7.     #include <netinet/in.h>
  8.     #include <netdb.h>        
  9.    
  10.  
  11.     #define PORT 3550        
  12.    
  13.  
  14.     #define MAXDATASIZE 100  
  15.    
  16.  
  17.     int main(int argc, char *argv[])
  18.     {
  19.        int fd, numbytes;      
  20.        
  21.  
  22.        char buf[MAXDATASIZE];  
  23.        
  24.  
  25.        struct hostent *he;        
  26.        
  27.  
  28.        struct sockaddr_in server;  
  29.        
  30.  
  31.        if (argc !=2) {
  32.          
  33.           printf("Uso: %s <Dirección IP>\n",argv[0]);
  34.           exit(-1);
  35.        }
  36.  
  37.        if ((he=gethostbyname(argv[1]))==NULL){      
  38.          
  39.           printf("gethostbyname() error\n");
  40.           exit(-1);
  41.        }
  42.  
  43.        if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){  
  44.          
  45.           printf("socket() error\n");
  46.           exit(-1);
  47.        }
  48.  
  49.        server.sin_family = AF_INET;
  50.        server.sin_port = htons(PORT);
  51.        
  52.        server.sin_addr = *((struct in_addr *)he->h_addr);  
  53.        
  54.  
  55.        if(connect(fd, (struct sockaddr *)&server,
  56.           sizeof(struct sockaddr))==-1){
  57.          
  58.           printf("connect() error\n");
  59.           exit(-1);
  60.        }
  61.  
  62.        if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1){  
  63.          
  64.           printf("Error en recv() \n");
  65.           exit(-1);
  66.        }
  67.  
  68.        buf[numbytes]='\0';
  69.  
  70.        printf("Mensaje del Servidor: %s\n",buf);
  71.        
  72.  
  73.        close(fd);  
  74.  
  75.     }
  76.  
  77.  
  78.  
  79. #elif WINDOWS
  80.     #include <stdio.h>
  81.     #include <stdlib.h>
  82.     #include <sys/types.h>
  83.     #include <winsock2.h>
  84.     #include <netinet/in.h>
  85.     #include <netdb.h>        
  86.    
  87.  
  88.     #define PORT 3550        
  89.    
  90.  
  91.     #define MAXDATASIZE 100  
  92.    
  93.  
  94.     int main(int argc, char *argv[])
  95.     {
  96.         WSADATA wsa;
  97.  
  98.         WSAStartup(MAKEWORD(2,2),&wsa);
  99.    
  100.        int fd, numbytes;      
  101.        
  102.  
  103.        char buf[MAXDATASIZE];  
  104.        
  105.  
  106.        struct hostent *he;        
  107.        
  108.  
  109.        struct sockaddr_in server;  
  110.        
  111.  
  112.        if (argc !=2) {
  113.          
  114.           printf("Uso: %s <Dirección IP>\n",argv[0]);
  115.           exit(-1);
  116.        }
  117.  
  118.        if ((he=gethostbyname(argv[1]))==NULL){      
  119.          
  120.           printf("gethostbyname() error\n");
  121.           exit(-1);
  122.        }
  123.  
  124.        if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){  
  125.          
  126.           printf("socket() error\n");
  127.           exit(-1);
  128.        }
  129.  
  130.        server.sin_family = AF_INET;
  131.        server.sin_port = htons(PORT);
  132.        
  133.        server.sin_addr = *((struct in_addr *)he->h_addr);  
  134.        
  135.  
  136.        if(connect(fd, (struct sockaddr *)&server,
  137.           sizeof(struct sockaddr))==-1){
  138.          
  139.           printf("connect() error\n");
  140.           exit(-1);
  141.        }
  142.  
  143.        if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1){  
  144.          
  145.           printf("Error en recv() \n");
  146.           exit(-1);
  147.        }
  148.  
  149.        buf[numbytes]='\0';
  150.  
  151.        printf("Mensaje del Servidor: %s\n",buf);
  152.        
  153.  
  154.        close(fd);  
  155.         WSACleanup();
  156.     }
  157. #endif