Saltar para o conteúdo

Programar em C/Sockets

Origem: Wikilivros, livros abertos por um mundo aberto.

A versão Unix BSD 4.1c de 1982 para VAX foi a primeira a incluir TCP/IP no kernel do sistema operacional, oferecendo ao mesmo tempo uma interface de programação como abstração para esses protocolos. Os soquetes ou sockets são uma API (Application Program Interface) isso quer dizer uma interface entre os programas e a camada de transporte. Exemplo: TCP, UDP. Os soquetes podem usar outros protocolos como AppleTalk, Xérox XNS, etc. A API de sockets foi desenvolvida para a linguagem C e são uma das principais API para sistemas do tipo UNIX. O Windows possui uma interface similar conhecida com o nome de Winsock.

Funções da biblioteca padrão

[editar | editar código-fonte]
int     accept(int, struct sockaddr *restrict, socklen_t *restrict);
int     bind(int, const struct sockaddr *, socklen_t);
int     connect(int, const struct sockaddr *, socklen_t);
int     getpeername(int, struct sockaddr *restrict, socklen_t *restrict);
int     getsockname(int, struct sockaddr *restrict, socklen_t *restrict);
int     getsockopt(int, int, int, void *restrict, socklen_t *restrict);
int     listen(int, int);
ssize_t recv(int, void *, size_t, int);
ssize_t recvfrom(int, void *restrict, size_t, int,
        struct sockaddr *restrict, socklen_t *restrict);
ssize_t recvmsg(int, struct msghdr *, int);
ssize_t send(int, const void *, size_t, int);
ssize_t sendmsg(int, const struct msghdr *, int);
ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *,
        socklen_t);
int     setsockopt(int, int, int, const void *, socklen_t);
int     shutdown(int, int);
int     socket(int, int, int);
int     sockatmark(int);
int     socketpair(int, int, int, int[2]);

Famílias de endereço

[editar | editar código-fonte]

Existem varias famílias de endereço e cada uma corresponde a um protocolo em particular.
As famílias mais usadas são :

AF_UNIX: Protocolo interno do UNIX
AF_INET: Protocolo Internet
AF_NS  : Protocolo de Xerox NS

Estruturas de endereço

[editar | editar código-fonte]

Varias chamada ao sistema de redes do unix precisam apontar para uma estrutura de endereço de socket.
A definição dessas estruturas esta definida dentro do cabeçalho <sys/socket.h>.

struct sockaddr {
  u_short sa_family ;
  char sa_data[14] ;
} ;

sa_family: Família de endereço leva o valor AF_xxx .
sa_data: endereço especifico de protocolo .

Para a família internet as estrutura estão definidas dentro do cabeçalho <netinet/in.h>.

struct in_addr {
  u_long s_addr ;
} ;


struct sockaddr_in {
  short sin_family ;
  u_short sin_port ;
  struct in_addr sin_addr ;
  char sin_zero[8] ;
} ;