Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Plástico Bolha

Servidor - Socket

Recommended Posts

Ola a todos não consigo fazer o código abaixo compilar (DevC++ 4.9.9.2), gostaria de uma ajuda para saber como concertar isso, ou se esta faltando (provavel) adicionar, alguma referência a alguma dll, não mensionada na linha de comando, Enfim ... Ou tambem esboça um modelo de socket diferente deste abaixo mas que compile (servidor), seja como for obrigado:

 

// Esse é um modelo de servidor, adicionei apenas essas duas referências na linha de comando: -l wsock32 -l Ws2_32, mas continua não compilando Os erros estão no final
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <winreg.h>
#include <winsock.h> 
#include <Winuser.h>
#include <iostream>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <conio.h>
#define UNICODE

main()
{
  int cont,create_socket,new_socket,addrlen;
  int bufsize = 1024;
  char *buffer = malloc(bufsize);
  struct sockaddr_in address;

  printf("\x1B[2J");
  if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
    printf("The socket was created\n");
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = INADDR_ANY;
  address.sin_port = htons(15000);
  if (bind(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
    printf("Binding Socket\n");
  listen(create_socket,3);
  addrlen = sizeof(struct sockaddr_in);
  new_socket = accept(create_socket,(struct sockaddr *)&address,&addrlen);
  if (new_socket > 0){
     printf("The Client %s is connected...\n",inet_ntoa(address.sin_addr));
     for(cont=1;cont<5000;cont++)
  printf("\x7");
  }
  do{
     printf("Message to send: ");
     gets(buffer);
     send(new_socket,buffer,bufsize,0);
     recv(new_socket,buffer,bufsize,0);
     printf("Message recieved: %s\n",buffer);
  }while(strcmp(buffer,"/q")); //user ‘q’ to quit
  close(new_socket);
  close(create_socket);
}

 

Erros:

server.cpp C:\Users\Raul\Desktop\C sys/socket.h: No such file or directory.

server.cpp C:\Users\Raul\Desktop\C netinet/in.h: No such file or directory.

server.cpp In function `int main()':

server.cpp invalid conversion from `void*' to `char*'

 

Obrigado desde ja

Compartilhar este post


Link para o post
Compartilhar em outros sites
server.cpp C:\Users\Raul\Desktop\C sys/socket.h: No such file or directory.

server.cpp C:\Users\Raul\Desktop\C netinet/in.h: No such file or directory.

 

Ele não achou os headers indicados. De uma conferida pra ver se estão realmente lá (provavelmente não).

Compartilhar este post


Link para o post
Compartilhar em outros sites
server.cpp C:\Users\Raul\Desktop\C sys/socket.h: No such file or directory.

server.cpp C:\Users\Raul\Desktop\C netinet/in.h: No such file or directory.

 

Ele não achou os headers indicados. De uma conferida pra ver se estão realmente lá (provavelmente não).

 

Eu declarei eles:

#include<netinet/in.h>

#include<sys/socket.h>

 

Mas será preciso colocar mais alguma coisa na linha de comando além de: -l wsock32 -l Ws2_32 Ou

Esta faltando pacotes de compilação ? (Rodei 2 clientes sockets, com DevC++ e nem precisei de pacotes estranho ou não sei la ^_^)

Obrigado (Comecei a mexer com sockets pouco tempo ... Perdoe a ignorância e valeu a atenção ^_^)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim você declarou os headers... mas ele existem?

 

se eu escrever #include <bozo.h> ele vai acusar o mesmo erro.

 

C:\Testes\main.cpp|2|error: bozo.h: No such file or directory|

||=== Build finished: 1 errors, 0 warnings ===|

 

De uma olhada no diretorios de onde seu compilador puxa os .h

E note que mesmo que um .h esteja la no diretório ele pode chamar outros headers que não estão...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim você declarou os headers... mas ele existem?

 

se eu escrever #include <bozo.h> ele vai acusar o mesmo erro.

 

C:\Testes\main.cpp|2|error: bozo.h: No such file or directory|

||=== Build finished: 1 errors, 0 warnings ===|

 

De uma olhada no diretorios de onde seu compilador puxa os .h

E note que mesmo que um .h esteja la no diretório ele pode chamar outros headers que não estão...

 

Infelismente eu procurei bastante, mas não consegui achar essas duas bibliotecas ... O que se fazer então ? Pode baixar elas só '-' ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que sejam do linux esses headres, pelo menos por padrão. Para windows acho que só com winsock já seria possivel trabalhar com sockets.

 

Aqui no forum tem um exemplo do uso de sockets em linux, e os headers que te faltam são declarados nesse exemplo.

http://forum.imasters.com.br/topic/265697-codigo-despertador-usando-socket/

 

Exemplo de winsock aqui no forum nao achei para linkar, mas é só googlear que você acha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fui no grande oráculo (google), e achei esse server pra rodar no windows e ... Como sempre, sempre tem um erro nesses códigos ^_^. Esse server ficou grande porque o cara fez uns if pra rodar tanto com TCP como UDP ... Eu vou usar o TCP mesmo.

 

o erro foi esse: tolower' cannot be used as a function : tolower não pode ser usada como função. hmmm '-'. To aqui tentando ver como arrumar isso.

T++

// * Server program example for IPv4 */

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>



#define DEFAULT_PORT 2007

// default TCP socket type

#define DEFAULT_PROTO SOCK_STREAM



void Usage(char *progname)

{

   fprintf(stderr,"Usage: %s -p [protocol] -e [port_num] -i [ip_address]\n", progname);

   fprintf(stderr,"Where:\n\t- protocol is one of TCP or UDP\n");

   fprintf(stderr,"\t- port_num is the port to listen on\n");

   fprintf(stderr,"\t- ip_address is the ip address (in dotted\n");

   fprintf(stderr,"\t  decimal notation) to bind to. But it is not useful here...\n");

   fprintf(stderr,"\t- Hit Ctrl-C to terminate server program...\n");

   fprintf(stderr,"\t- The defaults are TCP, 2007 and INADDR_ANY.\n");

   WSACleanup();

   exit(1);

}



int main(int argc, char **argv)

{

   char Buffer[128];

   char *ip_address= NULL;

   unsigned short port=DEFAULT_PORT;

   int retval;

   int fromlen;

   int i;

   int tolower;

   int socket_type = DEFAULT_PROTO;

   struct sockaddr_in local, from;

   WSADATA wsaData;

   SOCKET listen_socket, msgsock;



   /* Parse arguments, if there are arguments supplied */

   if (argc > 1)

      {

       for(i=1; i<argc; i++)

             {

                    // switches or options...

           if ((argv[i][0] == '-') || (argv[i][0] == '/'))

                    {

                           // Change to lower...if any

                          [quote]switch(tolower(argv[i][1]))[/quote]

                          {

                    // if -p or /p

                   case 'p':

                       if (!stricmp(argv[i+1], "TCP"))

                           socket_type = SOCK_STREAM;

                       else if (!stricmp(argv[i+1], "UDP"))

                           socket_type = SOCK_DGRAM;

                       else

                           Usage(argv[0]);

                       i++;

                       break;

                    // if -i or /i, for server it is not so useful...

                   case 'i':

                       ip_address = argv[++i];

                       break;

                   // if -e or /e

                   case 'e':

                       port = atoi(argv[++i]);

                       break;

                    // No match...

                   default:

                       Usage(argv[0]);

                       break;

               }

           }

           else

               Usage(argv[0]);

       }

   }



   // Request Winsock version 2.2

   if ((retval = WSAStartup(0x202, &wsaData)) != 0)

      {

       fprintf(stderr,"Server: WSAStartup() failed with error %d\n", retval);

       WSACleanup();

       return -1;

   }

   else

      printf("Server: WSAStartup() is OK.\n");



   if (port == 0)

      {

       Usage(argv[0]);

   }



   local.sin_family = AF_INET;

   local.sin_addr.s_addr = (!ip_address) ? INADDR_ANY:inet_addr(ip_address);



   /* Port MUST be in Network Byte Order */

   local.sin_port = htons(port);

   // TCP socket

   listen_socket = socket(AF_INET, socket_type,0);



   if (listen_socket == INVALID_SOCKET){

       fprintf(stderr,"Server: socket() failed with error %d\n", WSAGetLastError());

       WSACleanup();

       return -1;

   }

   else

      printf("Server: socket() is OK.\n");



   // bind() associates a local address and port combination with the socket just created.

   // This is most useful when the application is a

   // server that has a well-known port that clients know about in advance.

   if (bind(listen_socket, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR)

      {

       fprintf(stderr,"Server: bind() failed with error %d\n", WSAGetLastError());

       WSACleanup();

       return -1;

   }

   else

             printf("Server: bind() is OK.\n");



    // So far, everything we did was applicable to TCP as well as UDP.

    // However, there are certain steps that do not work when the server is

    // using UDP. We cannot listen() on a UDP socket.

   if (socket_type != SOCK_DGRAM)

      {

       if (listen(listen_socket,5) == SOCKET_ERROR)

             {

           fprintf(stderr,"Server: listen() failed with error %d\n", WSAGetLastError());

           WSACleanup();

           return -1;

       }

      else

             printf("Server: listen() is OK.\n");

   }

   printf("Server: %s: I'm listening and waiting connection\non port %d, protocol %s\n", argv[0], port, (socket_type == SOCK_STREAM)?"TCP":"UDP");



      while(1)

      {

       fromlen =sizeof(from);

       // accept() doesn't make sense on UDP, since we do not listen()

       if (socket_type != SOCK_DGRAM)

             {

           msgsock = accept(listen_socket, (struct sockaddr*)&from, &fromlen);

           if (msgsock == INVALID_SOCKET)

          {

               fprintf(stderr,"Server: accept() error %d\n", WSAGetLastError());

               WSACleanup();

               return -1;

           }

          else

             printf("Server: accept() is OK.\n");

             printf("Server: accepted connection from %s, port %d\n", inet_ntoa(from.sin_addr), htons(from.sin_port)) ;



       }

       else

           msgsock = listen_socket;



       // In the case of SOCK_STREAM, the server can do recv() and send() on

       // the accepted socket and then close it.

       // However, for SOCK_DGRAM (UDP), the server will do recvfrom() and sendto()  in a loop.

       if (socket_type != SOCK_DGRAM)

           retval = recv(msgsock, Buffer, sizeof(Buffer), 0);



      else

      {

           retval = recvfrom(msgsock,Buffer, sizeof(Buffer), 0, (struct sockaddr *)&from, &fromlen);

           printf("Server: Received datagram from %s\n", inet_ntoa(from.sin_addr));

       }



       if (retval == SOCKET_ERROR)

             {

           fprintf(stderr,"Server: recv() failed: error %d\n", WSAGetLastError());

           closesocket(msgsock);

           continue;

       }

      else

           printf("Server: recv() is OK.\n");



       if (retval == 0)

             {

           printf("Server: Client closed connection.\n");

           closesocket(msgsock);

           continue;

       }

       printf("Server: Received %d bytes, data \"%s\" from client\n", retval, Buffer);



       printf("Server: Echoing the same data back to client...\n");

       if (socket_type != SOCK_DGRAM)

           retval = send(msgsock, Buffer, sizeof(Buffer), 0);

       else

           retval = sendto(msgsock, Buffer, sizeof(Buffer), 0, (struct sockaddr *)&from, fromlen);



             if (retval == SOCKET_ERROR)

             {

                    fprintf(stderr,"Server: send() failed: error %d\n", WSAGetLastError());

              }

             else

                    printf("Server: send() is OK.\n");



       if (socket_type != SOCK_DGRAM)

      {

           printf("Server: I'm waiting more connection, try running the client\n");

           printf("Server: program from the same computer or other computer...\n");

           closesocket(msgsock);

       }

       else

           printf("Server: UDP server looping back for more requests\n");

       continue;

   }

      return 0;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque os código dentro da tag code por favor, fica muito mais facil de visualizar.

Em determinada parte do código é declarado:

 

int tolower;

 

Então lá no swtich ele está pensando que tolower é um inteiro e você quer usar ele como função ao invés da verdadeira função tolower();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque os código dentro da tag code por favor, fica muito mais facil de visualizar.

Em determinada parte do código é declarado:

 

int tolower;

 

Então lá no swtich ele está pensando que tolower é um inteiro e você quer usar ele como função ao invés da verdadeira função tolower();

 

Ae achei um servidor menor que o outro acima, esse server compila no DevC++ sem nenhum aviso do compilar, ele é feito em C++, Os meus dois clientes são feitos em "C", eu acho que não problema (na verdade eu nunca testei...), acredito que não tem problema.

 

#include <windows.h>

#include <winsock2.h>

#include <stdio.h>

#include <stdlib.h>

 

int main(int argc, char *argv[]){

WSADATA t_wsa; // WSADATA structure

WORD wVers; // version number

int iError; // error number

 

wVers = MAKEWORD(2, 2); // Set the version number to 2.2

iError = WSAStartup(wVers, &t_wsa); // Start the WSADATA

 

if(iError != NO_ERROR || iError == 1){

MessageBox(NULL, (LPCTSTR)"Error at WSAStartup()", (LPCTSTR)"Server::Error", MB_OK|MB_ICONERROR);

WSACleanup();

return 0;

}

 

if(LOBYTE(t_wsa.wVersion) != 2 || HIBYTE(t_wsa.wVersion) != 2){

MessageBox(NULL, (LPCTSTR)"Error at WSAStartup()", (LPCTSTR)"Server::Error", MB_OK|MB_ICONERROR);

WSACleanup();

return 0;

}

 

SOCKET sServer;

sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sServer == INVALID_SOCKET || iError == 1){

MessageBox(NULL, (LPCTSTR)"Invalid Socket!", (LPCTSTR)"Server::Error", MB_OK|MB_ICONERROR);

WSACleanup();

return 0;

}

 

SOCKADDR_IN sinServer;

memset(&sinServer, 0, sizeof(sinServer));

 

sinServer.sin_family = AF_INET;

sinServer.sin_addr.s_addr = INADDR_ANY; // Where to start server?

sinServer.sin_port = htons(1000); // Port

 

if(bind(sServer, (LPSOCKADDR)&sinServer, sizeof(sinServer)) == SOCKET_ERROR){

/* failed at starting server */

MessageBox(NULL, (LPCTSTR)"Could not bind the server!", (LPCTSTR)"Server::Error", MB_OK|MB_ICONERROR);

WSACleanup();

return 0;

}

 

while(listen(sServer, 20) == SOCKET_ERROR){

Sleep(10);

}

 

SOCKET sClient;

int szlength;

 

szlength = sizeof(sinServer);

sClient = accept(sServer, (LPSOCKADDR)&sinServer, &szlength);

 

if (sClient == INVALID_SOCKET){

MessageBox(NULL, (LPCTSTR)"Could not accept this client!", (LPCTSTR)"Server::Error", MB_OK|MB_ICONERROR);

closesocket(sServer);

WSACleanup();

return 0;

} else {

MessageBox(NULL, (LPCTSTR)"Accepted a Client!", (LPCTSTR)"Server::Success", MB_OK);

}

 

// Now we can send/recv data!

int iRet;

char buffer[200];

strcpy(buffer, "Welcome to our Server!\0");

iRet = send(sClient, buffer, strlen(buffer), 0);

if(iRet == SOCKET_ERROR){

MessageBox(NULL, (LPCTSTR)"Could not send data!", (LPCTSTR)"Server::Error", MB_OK|MB_ICONERROR);

closesocket(sClient);

closesocket(sServer);

WSACleanup();

return 0;

}

 

char autoresponse[80];

int bytes;

strcpy(autoresponse, "Message Received!");

autoresponse[strlen(autoresponse)-1] = 0;

MessageBox(NULL, (LPCTSTR)"Server is ready for messages and is hiding!", (LPCTSTR)"Server::Success", MB_OK);

char *cClientMessage;

cClientMessage = new char[600];

cClientMessage[599] = 0;

 

while(bytes = recv(sClient, cClientMessage, 599, 0)){

if(bytes < 1){

Sleep(300);

continue;

}

MessageBox(NULL, (LPCTSTR)cClientMessage, (LPCTSTR)"Server::Message Received", MB_OK|MB_ICONEXCLAMATION);

iRet = send(sClient, autoresponse, strlen(autoresponse), 0);

if(iRet == SOCKET_ERROR){

MessageBox(NULL, (LPCTSTR)"Could not send response!", (LPCTSTR)"Server::Error", MB_OK|MB_ICONERROR);

closesocket(sClient);

closesocket(sServer);

WSACleanup();

return 0;

}

delete [] cClientMessage;

cClientMessage = new char[600];

cClientMessage[599] = 0;

Sleep(100); // Don't consume too much CPU power.

}

 

delete [] cClientMessage;

// Cleanup

closesocket(sClient);

closesocket(sServer);

// Shutdown Winsock

WSACleanup();

return 0;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.