Programação de Sockets
soquete de programação - Application Programming Interface (API)
Interface de Programação de rede
Application Programming Interface API (Application Programming Interface)
Application Programming Interface API: é o controle e controle do processo de aplicação do sistema operativo será uma interface chamada de sistema de transição.
Alguns típica interface de programação de aplicativo :
- Berkeley UNIX sistema operacional define uma API, chamada tomada de interface (interface de socket), referido como um soquete (socket).
- sistema operacional Microsoft usa sua interface com o API socket, uma forma ligeiramente diferente da API, e chamou Windows Socket Interface, WINSOCK.
- AT & T UNIX System V para uma API definido, abreviado como TLI (Transport Layer Interface)
Programação de Sockets -socket API Overview
- Originalmente concebida: para BSD UNIX-Berkley, para as interfaces da pilha de protocolos TCP / IP
- Atualmente: de facto padrão da indústria, a grande maioria dos sistemas operacionais suportam
- A interface do aplicativo API mais típica de rede Internet
- Comunicação Modelo: cliente / servidor (C / S)
- -Aplicação Inter processo de comunicação abstracção
Identificar pontos finais da comunicação (externas): Número + porta de endereço IP
Como operar a tomada de gerenciamento de sistema / processo (interno)? A: Descritor soquete (descritor de socket), um pequeno número inteiro
soquete abstrato
Semelhante ao arquivo de resumo quando o processo de aplicação cria um socket, o sistema operacional aloca uma estrutura de dados para armazenar informações sobre o soquete, voltou descritor de socket
estrutura de endereço
estrutura definida sockaddr_in:
structsockaddr_in
{
u_charsin_len; /*地址长度*/
u_charsin_family; /*地址族(TCP/IP:AF_INET)*/
u_shortsin_port; /*端口号*/
structin_addrsin_addr;/*IP地址*/
char sin_zero[8]; /*未用(置0)*/
}
Usando conjunto de protocolos TCP / IP da declaração de aplicações de rede endpoint variável de endereço, usando o sockaddr_in estrutura
função -socket API de soquete de programação
função API Socket (Winsock)
//WSAStartup
intWSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
//WSACleanup
intWSACleanup(void);
aplicação de uso soquete deve primeiro chamar a função WSAStartup antes de usar soquete
- O primeiro parâmetro indica que o programa pedido WinSock versão, em que o byte alto indicar a versão menor, o byte inferior indica a versão principal.
- Hexadecimal de número inteiro, por exemplo 0x102 representa versão 2.1
- O segundo argumento retorna as informações versão do WinSock real
- Estrutura WSADATA ponteiro
//使用2.1版本的WinSock的程序代码段
wVersionRequested= MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData);
Após a conclusão do aplicativo usando a solicitação de biblioteca de sockets, e, finalmente, a função WSACleanup chamada, os recursos do sistema UNBIND e tomada de libertação biblioteca ocupada soquete Biblioteca
sd= socket(protofamily,type,proto);
Criar um socket, o sistema operacional retorna soquete descritor (SD), o primeiro parâmetro (família de protocolos): protofamily = PF_INET (TCP / IP), o segundo parâmetro (tipo soquete): type = SOCK_STREAM,SOCK_DGRAM orSOCK_RAW(TCP/IP
o terceiro parâmetros (número de protocolo): 0 é o padrão
//创建一个流套接字的代码段
structprotoent*p;
p=getprotobyname("tcp");
SOCKET sd=socket(PF_INET,SOCK_STREAM,p->p_proto);
Tomada tipo de TCP / IP orientada a serviços
- TCP: fiável, orientada a ligação, a transmissão byte de fluxo, ponto
- UDP: transporte de datagramas não confiável, sem conexão
int closesocket(SOCKET sd);
Fechar uma SD descritor de socket, se uma pluralidade de processos compartilham uma tomada, a tomada de contagem de referência closesocket por 1, é reduzido para 0 não está fechado, um processo de um soquete de multi-threaded não adianta contagem, se um processo de chamadas de rosca closesocket vai encerrar um socket, outros segmentos no processo não será capaz de acessar o soquete, o valor de retorno: 0: sucesso, SOCKET_ERROR: falha
int bind(sd,localaddr,addrlen);
A ligação de uma tomada de endereço ponto de extremidade local: número IP + porta de endereço
descritor de socket (sd), endereço de endpoint (o LocalAddr): Parâmetro
Os clientes geralmente não têm para chamar a função de ligação
Servidor: número de porta bem conhecido, endereço IP
int listen(sd,queuesize);
Oposto servidor tomada corrente secundária em estado de escuta, apenas as chamadas do servidor, somente para soquete de fluxo orientado a conexão
Definição de um tamanho solicitação de conexão fila (QUEUESIZE)
Valor de retorno: 0: SOCKET_ERROR sucedida: Falha
connect(sd,saddr,saddrlen);
Ligue para conectar o cliente para fazer a função socket cliente (SD) com um computador tomada porta específica particular (o saddr) a (serviço) de conexão, apenas para o cliente, o cliente pode ser usado para o cliente TCP UDP também podem ser usados final, o cliente TCP: estabelecer uma conexão TCP, UDP cliente: especificar o endereço de ponto final do servidor
newsock= accept(sd,caddr,caddrlen);
chamada de função programa de serviço aceitar uma fila de conexões tomada foi no topo da solicitação do cliente a partir de um cliente solicita uma tomada de corrente em um sd estado de escuta, e cria um novo socket para criar um canal de conexão de soquete com o cliente, única à tomada TCP, somente para servidor
O uso das tomadas recém-criados (newsock) para se comunicar com os clientes
send(sd,*buf,len,flags);
TCP função socket send (cliente e servidor), ou chamar a função de conexão de socket cliente UDP
sendto(sd,*buf,len,flags,destaddr,addrlen);
função sendto para o soquete do servidor UDP e ligar a função não é chamada socket cliente UDP
recv(sd,*buffer,len,flags);
servidor UDP recebe função Recv socket cliente recebe dados a partir do outro lado da conexão TCP, ou a partir de uma chamada de função de dados de conexão enviada pelo
recvfrom(sd,*buf,len,flags,senderaddr,saddrlen);
terminal de função recvfrom para receber dados da tomada de UDP com o servidor não chamar a função de conexão socket cliente UDP
int setsockopt(intsd, intlevel, intoptname, *optval, intoptlen);
função setsockopt () é usado para definir o parâmetro de opção do sd tomada
int getsockopt(intsd, intlevel, intoptname, *optval, socklen_t*optlen);
uma função getsockopt () é usado para obter qualquer tipo, qualquer estado do valor actual das tomadas de opção, e armazena o resultado optval
WSAStartup: inicializar a biblioteca de sockets (somente WinSock)
WSACleanup: claro / encerrar o uso da biblioteca de sockets (somente WinSock)
socket: cria socket connect: "Connect" servidor remoto (somente cliente)
closesocket: Divulgação / Fechar o bind soquete: bind um socket local endereço IP eo número da porta (normalmente o cliente não)
a escuta: soquete servidor TCP lado oposto é modo de escuta, e definir o tamanho da fila (somente servidor TCP socket)
aceite: aceitar / extrair uma solicitação de conexão, um novo socket é criado, o novo soquete (apenas para socket TCP do lado do servidor)
a recv: recebimento de dados (um soquete cliente TCP ou modo conectado soquete do UDP)
recvfrom: receber pacotes de dados (UDP soquete usado para o modo não-conectado)
Enviar: envia dados (socket TCP para o cliente ou o UDP soquete modo conectado)
o sendto: envio de pacotes de dados (UDP soquete usado para o modo não-conectado)
o setsockopt: set opção parâmetros tomada
getSockOpt: Get tomada parâmetro da opção
rede byte ordem
TCP / IP define uma representação padrão inteiro binrio de um cabeçalho de protocolo: ordem de bytes da rede (rede byte ordem), alguns parâmetros de função API de socket precisa de ser armazenado em ordem de bytes de rede (tal como endereço IP, número da porta, etc.)
ordem de byte nativa pode ser conseguida entre a função de conversão ordem de byte rede
htons: ordem de byte nativa → ordem de bytes da rede (16bits)
ntohs: → locais Pedido de bytes da rede de bytes (16 bits)
htonl: ordem de byte nativa → ordem de bytes da rede (32bits)
ntohl: ordem de byte rede local → ordem de byte (32bits)
aplicações de rede soquete API (TCP) para chamar fluxo básico
Tomada Programação - design de software cliente
Resolver o endereço IP do servidor
O cliente pode usar o nome de domínio (por exemplo .: study.163.com) ou endereço IP (por exemplo: 123.58.180.121) identifica o servidor, usando o protocolo IP requer um 32 bit endereço IP binário, é necessário converter o nome de domínio ou endereço IP é um endereço IP de 32 bits
A função inet_addr () decimais com endereço de IP para a conversão de endereços IP 32
gethostbyname função () domínio para alcançar a conversão de endereços de IP 32, ele retorna um ponteiro para uma estrutura hostent ponteiro
servidor resolução (conhecida) número de porta
O cliente também pode usar o nome de serviço (por exemplo, HTTP) identificador de porta do servidor, as necessidades de nome de serviço para ser convertido para o número da porta bem conhecido, a função getservbyname () retorna um ponteiro para uma estrutura servent ponteiro
Resolution Protocol No.
O cliente pode usar o nome do protocolo (por exemplo: o TCP) especificar o protocolo, as necessidades de protocolo a ser convertido em protocolo de resolução de nome (por exemplo: 6), com a função getprotobyname () implementar protocolo número de protocolo conversão nome, retorna um ponteiro para uma protoent estrutura ponteiro
Processo TCP Client Software
1. Determinar o endereço IP do servidor eo número da porta
2. Criar um socket
3. Atribuir endpoint endereço local (endereço IP + número da porta)
4. servidor Connect (socket)
5. Siga o protocolo da camada de aplicação para comunicação
6. Feche a conexão / releasable
Processo UDP Client Software
1. Determinar o endereço IP do servidor eo número da porta
2. Criar um socket
3. Atribuir endpoint endereço local (endereço IP + número da porta)
4. Especifique o endereço de ponto final do servidor, estrutura UDP datagrama
5. Siga o protocolo da camada de aplicação para comunicação
6. Feche / liberar o soquete
soquete de programação - design de software de servidor
4 tipos de servidor básico
- No circuito de conexão (conexão iterativo) servidor
- Circuito orientado à conexão do servidor (iterativo orientado a conexão)
- Não há conexões simultâneas (sem conexão simultânea) servidor
- Concurrent orientado a conexão (orientado a conexão simultânea) tipos básicos de servidores servidor 4
servidor sem conexão loop de fluxo básico
1. Criar um socket
2. endereço de terminal de ligao (INADDR_ANY + número de porta)
3 recebe repetidamente um pedido de um cliente
4. Siga a mensagem de resposta de configuração do protocolo da camada de aplicação transmitido para o cliente
transmissão de dados:
O servidor não pode usar a função connect (), servidor de conexão usando a função sendto () para enviar pacotes de dados
O acesso ao endereço de endpoint cliente: recvfrom Call () função quando receber dados, extrair automaticamente
servidor orientado a conexão processa o ciclo básico
1. Criar um soquete (principal), se ligam e número de porta conhecido;
2. Defina o modo de socket de escuta (principal) passivo, pronto para o servidor;
3. A chamada accept () função recebe a próxima solicitação de conexão (através da tomada principal), cria um novo socket para estabelecer uma conexão com o cliente;
4. Seguir o protocolo da camada de aplicação, o cliente recebe o pedido repetidas, construções e envia uma resposta (via o novo socket);
5. Depois de serviço para um cliente em particular, fecha a ligação entre o cliente e volta ao passo 3. O servidor orientada a ligação processa o circuito básico
servidor sem conexão fluxo básico Concurrent
O segmento principal 1: criar uma tomada, de ligação e o número da porta bem conhecido;
O thread principal 2: repetidamente chama recvfrom () para receber a próxima solicitação do cliente, e cria um novo segmento em resposta ao processo do cliente;
1 fio criança: receber um pedido particular;
segmento de criança 2: De acordo com a mensagem de resposta de configuração do protocolo da camada de aplicação, e chama a transmissão sendto ();
segmento de criança 3: Exit (a sub-thread processar um pedido após o término)
processos do servidor orientado a conexão simultânea do básicas
O segmento principal 1: Criar o soquete (principal), se ligam e número de porta conhecido;
O thread principal 2: Definir modo de escuta socket passivo (principal), pronto para o servidor;
A principal linha 3: repetidamente chamada accept () função recebe a próxima solicitação de conexão (através da tomada principal), e cria um novo segmento de criança em resposta ao processo do cliente;
rosca 1 criança: receber uma solicitação de serviço ao cliente (pelo socket recém-criado);
segmento de criança 2: Seguindo o protocolo de camada de aplicação para interagir com um cliente particular;
segmento de criança 3: Desligue / liberar a conexão e sair (terminação thread)
exemplo
DIA ciclo servidor sem conexão
servidores orientados a conexão concomitantemente DIA