Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/04/2014, 02:24
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: error al compilar sockets en c

Hola amigo, yo sigo siendo un fiambre en esto (un queso), pero Code::Blocks te marca el número de línea en donde está el error, tratá de fijarte, ahí debería marcarte el número de línea.

De todas maneras te dejaré una gran ayuda, yo hace unos días andaba buscando algo sobre Sockets en C++ y encontré algo muy bueno, son 2 programas, un Servidor y un Cliente, pero lo bueno de estos programas, por lo menos el del Servidor, es que utiliza Threads, por lo tanto puedes aceptar un montón de conexiónes, yo lo probé abriendo varios clientes (programas .exe) y envié datos al servidor y llegaban perfectamente, espero que te pueda ayudar amigo.

A los programas ponele los nombres que yo te especificaré para que funcionen perfectamente (ejemplo.cpp):

Este es el Cliente, se llama: WinClient.cpp

Código C++:
Ver original
  1. #include <winsock2.h>
  2. #include <windows.h>
  3. #include <fcntl.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <stdio.h>
  8. #include <conio.h>
  9.  
  10. int main(int argv, char** argc){
  11.  
  12.     //The port and address you want to connect to
  13.     int host_port= 1101;
  14.     const char *host_name="127.0.0.1";
  15.  
  16.     //Initialize socket support WINDOWS ONLY!
  17.     unsigned short wVersionRequested;
  18.     WSADATA wsaData;
  19.     int err;
  20.     wVersionRequested = MAKEWORD( 2, 2 );
  21.     err = WSAStartup( wVersionRequested, &wsaData );
  22.     if ( err != 0 || ( LOBYTE( wsaData.wVersion ) != 2 ||
  23.             HIBYTE( wsaData.wVersion ) != 2 )) {
  24.         fprintf(stderr, "Could not find useable sock dll %d\n",WSAGetLastError());
  25.         exit(0);
  26.     }
  27.  
  28.     //Initialize sockets and set any options
  29.     int hsock;
  30.     int * p_int ;
  31.     hsock = socket(AF_INET, SOCK_STREAM, 0);
  32.     if(hsock == -1){
  33.         printf("Error initializing socket %d\n",WSAGetLastError());
  34.         exit(0);
  35.     }
  36.  
  37.     p_int = (int*)malloc(sizeof(int));
  38.     *p_int = 1;
  39.     if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
  40.         (setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
  41.         printf("Error setting options %d\n", WSAGetLastError());
  42.         free(p_int);
  43.         exit(0);
  44.     }
  45.     free(p_int);
  46.  
  47.     //Connect to the server
  48.     struct sockaddr_in my_addr;
  49.  
  50.     my_addr.sin_family = AF_INET ;
  51.     my_addr.sin_port = htons(host_port);
  52.  
  53.     memset(&(my_addr.sin_zero), 0, 8);
  54.     my_addr.sin_addr.s_addr = inet_addr(host_name);
  55.  
  56.  
  57.     if( connect( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == SOCKET_ERROR ){
  58.         fprintf(stderr, "Error connecting socket %d\n", WSAGetLastError());
  59.         exit(0);
  60.     }
  61.  
  62.     //Now lets do the client related stuff
  63.  
  64.     char buffer[1024];
  65.     int buffer_len = 1024;
  66.     int bytecount;
  67.  
  68.     int c;
  69.     memset(buffer, '\0', buffer_len);
  70.  
  71.     for(char* p=buffer ; (c=getch())!=13 ; p++){
  72.         printf("%c", c);
  73.         *p = c;
  74.     }
  75.  
  76.     if( (bytecount=send(hsock, buffer, strlen(buffer),0))==SOCKET_ERROR){
  77.         fprintf(stderr, "Error sending data %d\n", WSAGetLastError());
  78.         exit(0);
  79.     }
  80.     printf("Sent bytes %d\n", bytecount);
  81.  
  82.     if((bytecount = recv(hsock, buffer, buffer_len, 0))==SOCKET_ERROR){
  83.         fprintf(stderr, "Error receiving data %d\n", WSAGetLastError());
  84.         exit(0);
  85.     }
  86.     printf("Recieved bytes %d\nReceived string \"%s\"\n", bytecount, buffer);
  87.  
  88.     closesocket(hsock);
  89.  
  90.  
  91. ;
  92. }

Este otro es el Servidor, se llama: WinServer.cpp

Código C++:
Ver original
  1. #include <winsock2.h>
  2. #include <windows.h>
  3. #include <fcntl.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <stdio.h>
  8.  
  9. DWORD WINAPI SocketHandler(void*);
  10.  
  11. int main(int argv, char** argc){
  12.  
  13.     //The port you want the server to listen on
  14.     int host_port= 1101;
  15.  
  16.     //Initialize socket support WINDOWS ONLY!
  17.     unsigned short wVersionRequested;
  18.     WSADATA wsaData;
  19.     int err;
  20.     wVersionRequested = MAKEWORD( 2, 2 );
  21.     err = WSAStartup( wVersionRequested, &wsaData );
  22.     if ( err != 0 || ( LOBYTE( wsaData.wVersion ) != 2 ||
  23.             HIBYTE( wsaData.wVersion ) != 2 )) {
  24.         fprintf(stderr, "Could not find useable sock dll %d\n",WSAGetLastError());
  25.         exit(0);
  26.     }
  27.  
  28.     //Initialize sockets and set any options
  29.     int hsock;
  30.     int * p_int ;
  31.     hsock = socket(AF_INET, SOCK_STREAM, 0);
  32.     if(hsock == -1){
  33.         printf("Error initializing socket %d\n",WSAGetLastError());
  34.         exit(0);
  35.     }
  36.  
  37.     p_int = (int*)malloc(sizeof(int));
  38.     *p_int = 1;
  39.     if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
  40.         (setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
  41.         printf("Error setting options %d\n", WSAGetLastError());
  42.         free(p_int);
  43.         exit(0);
  44.     }
  45.     free(p_int);
  46.  
  47.     //Bind and listen
  48.     struct sockaddr_in my_addr;
  49.  
  50.     my_addr.sin_family = AF_INET ;
  51.     my_addr.sin_port = htons(host_port);
  52.  
  53.     memset(&(my_addr.sin_zero), 0, 8);
  54.     my_addr.sin_addr.s_addr = INADDR_ANY ;
  55.  
  56.     if( bind( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1 ){
  57.         fprintf(stderr,"Error binding to socket, make sure nothing else is listening on this port %d\n",WSAGetLastError());
  58.         exit(0);
  59.     }
  60.     if(listen( hsock, 10) == -1 ){
  61.         fprintf(stderr, "Error listening %d\n",WSAGetLastError());
  62.         exit(0);
  63.     }
  64.  
  65.     //Now lets to the server stuff
  66.  
  67.     int* csock;
  68.     sockaddr_in sadr;
  69.     int addr_size = sizeof(SOCKADDR);
  70.  
  71.     while(true){
  72.         printf("waiting for a connection\n");
  73.         csock = (int*)malloc(sizeof(int));
  74.  
  75.         if((*csock = accept( hsock, (SOCKADDR*)&sadr, &addr_size))!= INVALID_SOCKET ){
  76.             printf("Received connection from %s",inet_ntoa(sadr.sin_addr));
  77.             CreateThread(0,0,&SocketHandler, (void*)csock , 0,0);
  78.         }
  79.         else{
  80.             fprintf(stderr, "Error accepting %d\n",WSAGetLastError());
  81.         }
  82.     }
  83.  
  84.  
  85. }
  86.  
  87. DWORD WINAPI SocketHandler(void* lp){
  88.     int *csock = (int*)lp;
  89.  
  90.     char buffer[1024];
  91.     int buffer_len = 1024;
  92.     int bytecount;
  93.  
  94.     memset(buffer, 0, buffer_len);
  95.     if((bytecount = recv(*csock, buffer, buffer_len, 0))==SOCKET_ERROR){
  96.         fprintf(stderr, "Error receiving data %d\n", WSAGetLastError());
  97.         goto FINISH;
  98.     }
  99.     printf("Received bytes %d\nReceived string \"%s\"\n", bytecount, buffer);
  100.     strcat(buffer, " SERVER ECHO");
  101.  
  102.     if((bytecount = send(*csock, buffer, strlen(buffer), 0))==SOCKET_ERROR){
  103.         fprintf(stderr, "Error sending data %d\n", WSAGetLastError());
  104.         goto FINISH;
  105.     }
  106.  
  107.     printf("Sent bytes %d\n", bytecount);
  108.  
  109.  
  110. FINISH:
  111.     free(csock);
  112.     return 0;
  113. }

NOTA: A uno de estos programas lo modifiqué, no lo dejé de la manera adecuada porque lo quería probar a ver si compilaba y funcionaba, seguro es WinClient.cpp
Lo modifiqué porque me daba error al compilarlo. Solamente le cambié algunas líneas, por ejemplo cuando abrás el programa .exe que sería el Servidor, osea WinServer.exe, y luego abrás el WinClient.exe, la conexión se establecerá con éxito, pero cuando envías un mensaje al Servidor, el Servidor lo recibe, pero el cliente finaliza el programa, que no debería hacer eso, por eso están esos exit(0), pero es lo de menos, solo cambiás el exit(0) por lo que quieras que el programa cliente haga luego de enviar un mensaje al Servidor y listo eso es todo!!!!


¡¡Buena suerte!!