Foros del Web » Programación para mayores de 30 ;) » C/C++ »

programacion de sockets en c

Estas en el tema de programacion de sockets en c en el foro de C/C++ en Foros del Web. Hola a todos. Bueno de nuevo yo acudiendo a su ayuda. bueno es que ya llevo poco programando c y pues me llama la atencion ...
  #1 (permalink)  
Antiguo 11/04/2014, 19:18
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Pregunta programacion de sockets en c

Hola a todos.
Bueno de nuevo yo acudiendo a su ayuda.
bueno es que ya llevo poco programando c y pues me llama la atencion hacer programas que funcionen en red y encontrado en internet tutoriales de como programar sockets en linux y windows, he visto que en varios el codigo cambia y mi pregunta es ¿se puede programar socket y que funcionen en cualquier plataforma? y que si conocen o tienen un buen tutorial donde lo explique bien ya que e encontrado pero en algunos hay cosas que no explican y te dan el codigo fuente y en otros solo explican como abrir y cerrar un socket.
buenoe spero que em puedan ayudar.
  #2 (permalink)  
Antiguo 11/04/2014, 19:44
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: programacion de sockets en c

Hola Drewermerc, primero tenés que asegurarte de que los ejemplos que ves en alguna web, sean compatible con tu compilador, ya que no todos son los mismos, hay versiones y versiones.

Segundo, con un simple código ya podrías por ejemplo abrir una página web y extraer su contenido html, también podés usar esa conexión para entrar en un chat de IRC, se puede hacer de todo.

Tercero (y esto no estoy del todo seguro, es algo que pienso que es así), todos o casi todos los programas que hagas en C, siempre o casi siempre van a funcionar en cualquier sistema operativo, peeeeero, sólo si la persona que lo va a usar tenga el compilador para su Sistema Operativo, por ejemplo vos hacés tu programa de sockets en C, entónces podés pasarme a mi el código que yo uso windows, me podés pasar el código fuente .c o ya compilado .o, pero claro, yo para poder si o si usar tu programa necesitaría un compilador, por eso creo que, lo mejor, es que hagas tu programa y lo compilés en diferentes sistemas operativos y los distribuyas al programa ya compilado y disponible para cada S.O.

Creo que es la mejor forma, de hecho en muchísimas páginas he visto programas así.

Espero haberte aclarado algo y disculpa si me equivoqué en algo, trato de ayudarte!!
  #3 (permalink)  
Antiguo 11/04/2014, 19:50
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: programacion de sockets en c

hola Principe_Azul.
gracias por responder y bueno pues yo ahorita me encuentro desarrollando en linux y compilo en gcc, entonces si busco informacion de como programar sockets en c lo compilo y ejecuto y todo funciona bien si ese mismo codigo lo compilo en windows debe funcionar sin ningun problema.
  #4 (permalink)  
Antiguo 12/04/2014, 04:13
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: programacion de sockets en c

"...si ese mismo codigo lo compilo en windows debe funcionar sin ningun problema..."

Excepto que para windows debes iniciar la dll de winsocks para ese proceso, y al finalizar debes notificar que has terminado de usarlo (el sistema decidirá si finaliza la dll o si hay algun otro proceso usandola):

Código C:
Ver original
  1. WSADATA wsa;
  2.  
  3. if(WSAStartup(MAKEWORD(2, 0), &wsa)) {
  4.     //se produjo un error
  5. }
  6. //ya puedes trabajar con sockets
  7. ...
  8. //finalizas wsa
  9. WSACleanup();

Para lo demas la libreria de winsock2 tiene un set de funciones extendidas que difieren un poco de la libreria de sockets, asimismo las notificaciones asincronas de eventos de red son diferentes.

Tienes que buscar algun manual o la referencia de winsock y winsock2; la guia beej tambien te será de ayuda.

Suerte con eso
Saludos
vosk
  #5 (permalink)  
Antiguo 12/04/2014, 09:20
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: programacion de sockets en c

Los programas escritos en C multiplataforma usan la compilación condicional, utilizando sys/socket.h en linux y winsock2.h en windows. Osea no hay funciones que sean multiplataforma. Tendrás que crear el código específico para cada una. Por ejemplo:

Código C:
Ver original
  1. #ifdef LINUX
  2.     #include <sys/socket.h>
  3. #else
  4.     #include <winsock2.h>

  #6 (permalink)  
Antiguo 12/04/2014, 15:50
Avatar de 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
  #7 (permalink)  
Antiguo 12/04/2014, 16:39
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: programacion de sockets en c

Mmm pero cuando programas para Linux no incluyas <winsock2.h>, ni viceversa. Ademas por lo que puedo ver en los dos codigos haces lo mismo. Se supone que en la parte de Windows tenes que usar WSAStartup y no recuerdo que otras funciones.
  #8 (permalink)  
Antiguo 12/04/2014, 17:03
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: programacion de sockets en c

hola carbon.
bueno si son el mismo solo
si defino linux solo se compilara el primero codigo que es para linux y si cambio define por windows se compila la segunda opcion que es para windows solo que este es el mismo que elde linux nadamas le agrege el header winsock2.h y las funciones
WSADATA wsa; WSAStartup(MAKEWORD(2,2),&wsa); y tambien queria saber por que libreria tendria que cambiar #include <sys/types.h> y por que supongo que estas liberias tampoco funcionaran en windows.
  #9 (permalink)  
Antiguo 12/04/2014, 19:43
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: programacion de sockets en c

No sabría decirte, en Windows todo lo que necesitas estará en windows.h y winsock2.h. Mejor prueba haciendo códigos separados y después los juntas para tener bien en claro cada uno.
  #10 (permalink)  
Antiguo 12/04/2014, 21:22
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: programacion de sockets en c

hola carbon.
bueno pues ya puede compilar en windowslas librerias que se usan son estas:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <winsock2.h>
#include <windows.h>
y bueno pues solo lo pude compilar con devc++ con mingw me da error al usa las librerias de windows y no lo e podido solucionar por que por ejemplo encuentra la libreria windows.h pero si de hay manda a llamas o utiliza otra librerias manda erro un error que algo anda mal con esa libreria lo solucione y despues manda de otra libreria otro error y ues no pude solucionarlo y me quede con este error.
C:/Program Files (x86)/Windows Kits/8.0/Include/um/imm.h:40: error: redefinition of typedef 'LPUINT'
haber si alguien sabe por que y bueno la libreria ya la linke al ide es codeblocks.
bueno gracias a todos por sus respuestas.
  #11 (permalink)  
Antiguo 13/04/2014, 12:24
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: programacion de sockets en c

Prueba quitando el sys/types.h. Cuando usé sockets en windows no recuerdo haber necesitado eso.
  #12 (permalink)  
Antiguo 13/04/2014, 18:36
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: programacion de sockets en c

hola carbon.
bueno ya quite la libreria pero me sige dando el mismo error aqui esta error completo y la libreria donde me da el rror se llama winnt.h.

C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h|882|#error Must define a target architecture.|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h|1247|error: syntax error before "EXCEPTION_ROUTINE"|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h|1254|error: syntax error before '*' token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h|10749|error: syntax error before "PEXCEPTION_ROUTINE"|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h|10752|error: syntax error before '*' token|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\ include\excpt.h|68|error: 'EXCEPTION_REGISTRATION_RECORD' redeclared as different kind of symbol|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h|10750|error: previous declaration of 'EXCEPTION_REGISTRATION_RECORD' was here|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\ include\excpt.h|69|error: 'PEXCEPTION_REGISTRATION_RECORD' redeclared as different kind of symbol|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h|10752|error: previous declaration of 'PEXCEPTION_REGISTRATION_RECORD' was here|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winuser.h|1086|warning: declaration does not declare anything|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winuser.h|12838|warning: declaration does not declare anything|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winuser.h|12843|warning: declaration does not declare anything|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winioctl.h|7277|error: flexible array member in union|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winioctl.h|7278|error: flexible array member in union|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\objidlbase.h|143|error: redefinition of typedef 'IRpcChannelBuffer'|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\combaseapi.h|378|error: previous declaration of 'IRpcChannelBuffer' was here|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\objidlbase.h|185|error: redefinition of typedef 'IRpcStubBuffer'|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\combaseapi.h|377|error: previous declaration of 'IRpcStubBuffer' was here|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|473|pasting "/" and "/" does not give a valid preprocessing token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|473|error: syntax error before '/' token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|488|pasting "/" and "/" does not give a valid preprocessing token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|488|error: syntax error before '/' token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|516|error: syntax error before '}' token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|517|error: syntax error before '}' token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|519|error: syntax error before '}' token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|520|error: syntax error before '}' token|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|651|error: field `varDefaultValue' has incomplete type|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\oaidl.h|936|error: field `varValue' has incomplete type|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\propidl.h|137|error: redefinition of typedef 'PROPVARIANT'|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\combaseapi.h|1370|error: previous declaration of 'PROPVARIANT' was here|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\commdlg.h|704|error: redefinition of typedef 'CHOOSEFONT'|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\commdlg.h|689|error: previous declaration of 'CHOOSEFONT' was here|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\imm.h|40|error: redefinition of typedef 'LPUINT'|
C:\Program Files (x86)\Windows Kits\8.0\Include\um\mmsyscom.h|102|error: previous declaration of 'LPUINT' was here|
C:\progc\ifdef.c|7|netinet/in.h: No such file or directory|
||=== Build failed: 32 error(s), 3 warning(s) (0 minute(s), 1 second(s)) ===|
  #13 (permalink)  
Antiguo 15/04/2014, 13:19
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: programacion de sockets en c

Pues ahí ya me mataste No sabía decirte.
  #14 (permalink)  
Antiguo 15/04/2014, 15:01
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: programacion de sockets en c

Hola carbon.
bueno creo que tendo un poder especia por que te mate a distancia y por medio de internet.
bueno pues entonces creo que tendria que hacer alguna configuracon en condeclobk o nose pero bueno por lo menos si me copila en devc++ y bueno muchas gracias.
saludos

Etiquetas: funcion, int, programa, programacion, sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:08.