Função bind (sockets) não funciona em C++

1. Função bind (sockets) não funciona em C++

Anderson Miranda
Anderson1911

(usa Ubuntu)

Enviado em 10/03/2015 - 17:47h

Usei a seginte função


#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "main.h"

bool server(uint16_t _port){
static int _server_socket, _client_socket, bind, size;
static struct sockaddr_in _server, _client;

_server.sin_family = AF_INET;
_server.sin_port = htons(_port);
_server.sin_addr.s_addr = INADDR_ANY;

bzero(&(_server.sin_zero), 8);

_server_socket = socket(AF_INET, SOCK_STREAM, 0);

bind(_server_socket,(struct sockaddr *)&_server_socket, sizeof(struct sockaddr));
listen(_server_socket, BACKLOG);
}


o compilador retorna o erro:

‘bind’ cannot be used as a function|




  


2. Re: Função bind (sockets) não funciona em C++

Alexandre Mulatinho
mulatinho

(usa Slackware)

Enviado em 11/03/2015 - 15:32h

Nunca use variáveis com nome de funções padrões.

Você usou a variável com nome 'bind' e depois tentou usar a função 'bind', fiz uma função bugada na pressa para você entender

mlt@slack:~$ cat p.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void)
{
int soq, bind;
struct sockaddr_in s;


bind(soq, (struct sockadr *)&s, sizeof(s));
}


mlt@slack:~$ gcc -Wall -o p p.c
p.c: In function ‘main’:
p.c:12:6: error: called object ‘bind’ is not a function or function pointer
bind(soq, (struct sockadr *)&s, sizeof(s));



3. Re: Função bind (sockets) não funciona em C++

Paulo
paulo1205

(usa Ubuntu)

Enviado em 11/03/2015 - 21:46h

mulatinho escreveu:

Nunca use variáveis com nome de funções padrões.


Acho esse “nunca” um pouco forte. Não que eu discorde da ideia de que é bom evitar potenciais conflitos e supreposições de nomes, mas às vezes a gente usa um nome sem nem lembrar (às vezes mesmo sem saber, principalmente, quando existem bibliotecas de terceiros misturas no projeto) da sua existência num outro ponto do programa, e nem por isso dá erro.

Apesar do código que ele mostrou só usar efetivamente recursos do C e de bibliotecas feitas para uso com C, ele menciona C++ no título. O C++ padrão possui o conceito de espaços de nomes (namespaces) distintos para diferentes símbolos, e operadores que permitem a seleção do namespace de onde se deseja busca o símbolo. Todas as funções, variáveis e classes da biblioteca padrão do C++ ficam no namespace chamado std. Símbolos globais ficam no namespace global, que não tem um nome próprio, e é nesse namespace global que vão parar os símbolos declarados em arquivos pensados para uso com C (o C++ oferece reimplementações de alguns cabeçalhos da biblioteca padrão do C que copiam os símbolos do namespace global para o std). Ainda, quando se quer ter um símbolo visível somente dentro de um arquivo de código fonte (o que se faz em C colocando a especificação static no tipo da variável que de outro modo seria global), a abordagem do C++ é usar um namespace anônimo.

Se o programa do nosso amigo realmente está em C++, ele poderia manter a variável local com o nome bind, e usar o operador de seleção de namespace :: para ter acesso ao símbolo global.

Veja o seguinte exemplo, que espero que ajude a clarear o que eu quis dizer.

#include <cstdio>  // A versão C++ de stdio.h, que copia nomes para dentro de std.

void func(){
// Exemplo horroroso: por que alguém chamaria uma
// variável local inteira de "printf"? Só mesmo para
// ilustrar um ponto...
int printf=5;

// Usa printf() global para imprimir valor de printf local.
::printf("%d\n", printf);

// Mesma coisa, usando a cópia importada para dentro de std.
std::printf("%d\n", printf);
}


Outra ilustração.

// Este é o arquivo file.cpp
#include <cstdio>

int ivar=10; // Variável no namespace global.

namespace ns {
int ivar=20; // Variável no namespace ns.
}

namespace {
int ivar=30; // Variável num namespace anonimo; só é visível dentro de file.cpp
int othervar=40; // Outra variável no namespace anônim; só é visível dentro de file.cpp

// Função no namespace anônimo; só é visível dentro de file.cpp
int get_ivar(){
return ivar;
}
}

void f(){
int ivar=50;
int othervar=60;

printf("ivar=%d\n", ivar); // imprime 50, ivar local
printf("othervar=%d\n", othervar); // imprime 60, othervar local
printf("ns::ivar=%d\n", ns::ivar); // imprime 20, especificação explícita
printf("::ivar=%d\n", ::ivar); // imprime 10: global tem pioridade sobre anônimo
printf("::othervar=%d\n", ::othervar); // imprime 40, othervar do anônimo
printf("get_ivar()=%d\n", get_ivar()); // imprime 30, get_ivar usa ivar do mesmo namespace

{
using ::ivar;
printf("ivar=%d\n", ivar); // imprime 10, ivar global por força de ‘using’
}
{
using ns::ivar;
printf("ivar=%d\n", ivar); // imprime 20, ivar de ns por força de ‘using’
}
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts