Ir para conteúdo

POWERED BY:

Arquivado

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

Plástico Bolha

[Resolvido] Socket (IDE - DevC++)

Recommended Posts

Oi. Eu estava fazendo um socket e no DevC++ pela primeira vez e precisei ultilizar o "l wsock32" pra rodar o socket. Mas o "l wsock32" esta me ocasionando 1 problema. Eu consigo compilar o socket ou qualquer outro ccp ultilizando o "l wsock32". Mas o detalhe: ele ou qualquer outro cpp compila mas não cria executavel, e também rodar socket sem ele faz ocorrer um erro de link. Como fazer pra usar o "l wsock32" e criar executaveis normalmente, que obviamente deve haver um jeito de se fazer isso. ("Jeito" que eu não sei :mellow: )

 

Obrigado pela paciência

Qualquer dica é bem vinda, mesmo se não resolver

Compartilhar este post


Link para o post
Compartilhar em outros sites

como está compilando? mostre o comando que está utilizando, seu resultado e o(s) arqvuivo(s) gerado(s) pela compilação

 

provavelmente você está criando só o arquivo objeto, sem linkar com as libs pra gerar o executável

Compartilhar este post


Link para o post
Compartilhar em outros sites

OpA valeu por responder. Eeu vou colocar o procedimento que eu fiz aqui, vou pegar um exemplo MUITO simples pra explicar no DevC++

 

 

 

#include <iostream>

using namespace std;

int main ()
{
   cout << "Olá mundo!";
   return 0;
} 

 

 

Apos ter feito esse código acima eu fui em opções do compilador - depois - "adicionar os seguintes comandos quando chamar o compilador" - dentro do box coloquei "l wsock32" (sem aspas) e marquei a opção e tentei compilar pra ver. Tenho 0 erros. O quadradinho de compilamento aparece como "done" e nada de executavel, se for possivel teste ai na sua casa pra ver como vai ter o mesmo resultado "eu acho" ... Eu estou tentando compilar um cliente, mas sem o "l wsock32" tenho um erro de link =/. VOu te passar aqui o que estou tentando compilar no DevC++.

 

 

O que eu realmente estou tentando compilar no DevC++ é isso:( mas acredito eu que se eu conseguir compilar o Alô mundo acima eu compilo isso tambem que esta me retornando 0 erros. E o quadradinho de compilação aparece como "done" igual ao alô mundo acima.) Se você souber como compilar usando outra biblioteca ou mensionando outra coisa não tem problema o importante é compilar)

 

 

(O código abaixo é compilaveu peguei esse modelo de cliente do msdn para modificar)

 

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#pragma comment (lib, "wininet.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
#pragma comment(lib, "Ws2_32.lib")
#define WIN32_LEAN_AND_MEAN
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

int main(int argc, char **argv)
{
   WSADATA wsaData;
   SOCKET ConnectSocket = INVALID_SOCKET;
   struct addrinfo *result = NULL,
   *ptr = NULL, hints;
   char *sendbuf = "teste";
   char recvbuf[DEFAULT_BUFLEN];
   int iResult;
   int recvbuflen = DEFAULT_BUFLEN;


   if (argc != 2) {
  	 printf("uso: %s nome do servidor\n", argv[0]);
  	 return 1;
   }


   iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
   if (iResult != 0) {
  	 printf("erro com WSAStartup: %d\n", iResult);
  	 return 1;
   }

   ZeroMemory( &hints, sizeof(hints) );
   hints.ai_family = AF_UNSPEC;
   hints.ai_socktype = SOCK_STREAM;
   hints.ai_protocol = IPPROTO_TCP;


   iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
   if ( iResult != 0 ) {
  	 printf("Falha no Getaddrinfo: %d\n", iResult);
  	 WSACleanup();
  	 return 1;
   }


   for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
  	 ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
  	 if (ConnectSocket == INVALID_SOCKET) {
  		 printf("Falha no Socket: %ld\n", WSAGetLastError());
  		 WSACleanup();
  		 return 1;
  	 }

  	 iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
  	 if (iResult == SOCKET_ERROR) {
  		 closesocket(ConnectSocket);
  		 ConnectSocket = INVALID_SOCKET;
  		 continue;
  	 }
  	 break;
   }

   freeaddrinfo(result);

   if (ConnectSocket == INVALID_SOCKET) {
  	 printf("Unable to connect to server!\n");
  	 WSACleanup();
  	 return 1;
   }


   iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
   if (iResult == SOCKET_ERROR) {
  	 printf("Falha no envio: %d\n", WSAGetLastError());
  	 closesocket(ConnectSocket);
  	 WSACleanup();
  	 return 1;
   }

   printf("dados enviados: %ld\n", iResult);

   iResult = shutdown(ConnectSocket, SD_SEND);
   if (iResult == SOCKET_ERROR) {
  	 printf("Falha no fechamento: %d\n", WSAGetLastError());
  	 closesocket(ConnectSocket);
  	 WSACleanup();
  	 return 1;
   }


   do {
  	 iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
  	 if ( iResult > 0 )
  		 printf("dados recebidos: %d\n", iResult);
  	 else if ( iResult == 0 )
  		 printf("conecção fechada\n");
  	 else
  		 printf("falha ao reconectar: %d\n", WSAGetLastError());
   } while( iResult > 0 );


   closesocket(ConnectSocket);
   WSACleanup();
}

E é isso valeu, se souber da uma mão T++ ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

não uso dev c++, então não tenho como testar.

 

tem certeza de que esse 'l wsock32' está certo? Por acaso, não seria '-l wsock32'? Digo isso pois isso me parece um opção de linha de comando, como por exemplo:

gcc programa.c -l nome_da_lib

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você consegue compilar o código do cliente acima ? Se sim qual compilador você usa ? Obrigado

 

E quabndo eu modifiquei para: -l wsock32

 

tive os seguintes erros: Por acaso não seria necessário mensionar mais alguma coisa pra parar esses 2 erros ?

 

[Linker error] undefined reference to `getaddrinfo@16'

[Linker error] undefined reference to `freeaddrinfo@4'

ld returned 1 exit status

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você consegue compilar o código do cliente acima ? Se sim qual compilador você usa ? Obrigado

essa wsock32 é biblioteca Windows. Eu uso Linux. Não tenho como testar.

 

 

Sugiro que tente compilar em linha de comando. normalmente a linha de comando é mais flexível e completa.

 

Ou espere alguém mais dar alguma sugestão aqui. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi. Estava faltando isso aqui tambem DLL do getaddrinfo "-l Ws2_32". Valeu Beraldo se você não tivesse me explicado isso abaixo não tinha consegui valeu ;)

gcc programa.c -l nome_da_lib

 

OpA valeu pela dica senhor lord Mal ^_^

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.