View Full Version : [C] Erro Sockets


Aparicio
12-03-2008, 15:43
Boas

Estou aqui a fazer um programa que utiliza sockets (windows) que compila e corre sem problemas no dev-cpp em C++, extensão .cpp portanto, mas quando tento compilar em C ou seja com a extensão .c dá erros como:

`hostent' undeclared (first use in this function)
`h' undeclared (first use in this function)
`in_addr' undeclared (first use in this function)
`sockaddr' undeclared (first use in this function)
No projecto do dev-cpp tenho a lib libws2_32.a e também já experimentei a libwsock32.a, mas continua a dar erro ao compilar em C.

Não é suposto funcionar tanto em C como C++???

Cumps

Zaonpt
12-03-2008, 18:14
C está contido em C++, ou por outras palavras, é um subconjunto.

estranho seria fazeres um programa em c que corre com compilador e C mas não de C++

mostra o código que os erros mencionam sff.

Aparicio
12-03-2008, 18:25
Os erros são todos nesta parte de configuração e ligação do socket que não fui eu que escrevi, apenas adaptei.


struct sockaddr_in addr;
SOCKET s;
int r;
hostent* h;

memset((void*)&addr, 0, sizeof(addr));
addr.sin_addr.s_addr = inet_addr(SERVIDOR);
if(INADDR_NONE == addr.sin_addr.s_addr) h = gethostbyname(SERVIDOR);
else h = gethostbyaddr((const char*)&addr.sin_addr, sizeof(struct sockaddr_in), AF_INET);

addr.sin_family = AF_INET;
addr.sin_addr = *((in_addr*)*h->h_addr_list);
addr.sin_port = htons(PORTA);

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
r = connect(s, (sockaddr*)&addr, sizeof(struct sockaddr));

reise
12-03-2008, 18:51
Para mim falta aí uns includes.

mrjm
12-03-2008, 18:58
Bem antes de mais axo que te falta ai uns {} no struct nao???

Aparicio
12-03-2008, 19:14
Para mim falta aí uns includes.

Não pus o código todo apenas a parte que têm erros, tenho estes includes:
#include <stdio.h>
#include <winsock.h>
#include <string.h>
#include <time.h>
#include <conio.h>

Bem antes de mais axo que te falta ai uns {} no struct nao???

Nesta parte do socket baseei-me neste (http://energon.home.mindspring.com/tutorials/socket/socket_tutorial.html) tutorial, onde está praticamente como no meu código.
Se o problema fosse esses {}, compilando em C++ também daria erro ou não?


É que pelos erros parece que é falta de libs mas tenho as mesmas que ao compilar em c++...

mrjm
12-03-2008, 19:17
Pelo tipo de erros que dá eu acho que as variaveis nao foram é inicializadas, ve se o nome com que inicializavas é igual ao que usas no resto do codigo =)

Aparicio
12-03-2008, 19:31
Pois, não foram inicializadas porque a lib necessária não foi "linkada".

E excepto o s, mais nenhuma daquelas variáveis é utilizada fora do código que pus acima.

mrjm
12-03-2008, 20:08
e enato k tal declarares as variaveis?

Aparicio
13-03-2008, 13:52
Depois de muito procurar lá encontrei código do Socket que compila em C.


struct hostent *remoteHost = gethostbyname( SERVIDOR );
struct sockaddr_in addr;
addr.sin_addr.s_addr = *(u_long *) remoteHost -> h_addr_list[0];
addr.sin_family = AF_INET;
addr.sin_port = htons( PORTA );

Obrigado