Programar em C/Sockets
Abstrações
editarA 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
editarint 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
editarExistem 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
editarVarias 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] ;
} ;