Enchufe de Programación
la programación del zócalo - Application Programming Interface (API)
Interfaz de programación de la red
interfaz de programación de aplicaciones API (Application Programming Interface)
De programación de aplicaciones API de interfaz: es el control y el control del proceso de aplicación del sistema operativo será una interfaz de llamada al sistema de transición.
Alguna de las interfaces de programación de aplicaciones típicas :
- Berkeley sistema operativo UNIX define una API, llamada interfaz de socket (interfaz de socket), que se refiere como un socket (socket).
- sistema operativo Microsoft utiliza su interfaz con el API del conector, una forma ligeramente diferente de la API, y se llama interfaz de socket de Windows, WINSOCK.
- AT & T UNIX System V para un API definido, abreviado como TLI (Transport Layer Interface)
Enchufe de programación -socket generales del API
- Originalmente diseñado: para BSD UNIX-Berkley, para las interfaces de la pila de protocolos TCP / IP
- Actualmente: estándar de facto de la industria, la gran mayoría de los sistemas operativos admiten
- La interfaz de red de Internet más típica aplicación API
- Modelo de comunicación: cliente / servidor (C / S)
- Entre aplicaciones abstracción proceso de comunicación
Identificar puntos finales de comunicación (externos): número de puerto + dirección IP
Cómo operar el zócalo de la gestión del sistema / proceso (interno)? A: descriptor de socket (descriptor de socket), un pequeño número entero
abstracta socket
Al igual que en el archivo abstracta cuando el proceso de aplicación crea un socket, el sistema operativo asigna una estructura de datos para almacenar información sobre el zócalo, regresó descriptor de socket
estructura de direcciones
sockaddr_in estructura definida:
structsockaddr_in
{
u_charsin_len; /*地址长度*/
u_charsin_family; /*地址族(TCP/IP:AF_INET)*/
u_shortsin_port; /*端口号*/
structin_addrsin_addr;/*IP地址*/
char sin_zero[8]; /*未用(置0)*/
}
A través de TCP / IP conjunto de protocolos de declaración de aplicaciones de red variable de dirección de punto final, utilizando la estructura sockaddr_in
función de la API -socket programación de sockets
función API Socket (WinSock)
//WSAStartup
intWSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
//WSACleanup
intWSACleanup(void);
aplicación de uso del zócalo debe llamar primero la función WSAStartup antes de usar Socket
- El primer parámetro indica la solicitud de la versión del programa de WinSock, en donde el byte alto indica la versión secundaria, el byte inferior indica la versión principal.
- Hexadecimal número entero, por ejemplo 0x102 representa versión 2.1
- El segundo argumento devuelve la información de versión del WinSock real
- Estructura puntero WSADATA
//使用2.1版本的WinSock的程序代码段
wVersionRequested= MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData);
Al término de la aplicación utilizando la biblioteca pedir zócalo, y finalmente a la función WSACleanup llamada, los recursos de desvinculación y hembra del sistema de liberación biblioteca ocuparon Biblioteca Socket
sd= socket(protofamily,type,proto);
Crear un socket, el sistema operativo vuelve socket descriptor (SD), el primer parámetro (familia de protocolos): protofamily = PF_INET (TCP / IP), el segundo parámetro (tipo socket): type = SOCK_STREAM,SOCK_DGRAM orSOCK_RAW(TCP/IP
la tercera parámetros (número de protocolo): 0 es el valor predeterminado
//创建一个流套接字的代码段
structprotoent*p;
p=getprotobyname("tcp");
SOCKET sd=socket(PF_INET,SOCK_STREAM,p->p_proto);
Tipo del zócalo orientada a servicios de TCP / IP
- TCP: fiable, orientado a la conexión, la transmisión de flujo de bytes, punto
- UDP: el transporte de datagramas no fiable, sin conexión
int closesocket(SOCKET sd);
Cerrar una sd descriptor de socket, si una pluralidad de procesos comparten un socket, el zócalo closesocket recuento de referencia por 1, se reduce a 0 no está cerrada, un proceso de una toma de multi-roscado sin utilizar el conteo, si un proceso de llamadas de rosca closesocket se apagará una toma de corriente, otros hilos en el proceso no será capaz de acceder a la toma, el valor de retorno: 0: éxito, SOCKET_ERROR: el fracaso
int bind(sd,localaddr,addrlen);
La unión de un extremo local dirección de socket: número de puerto + dirección IP
descriptor de socket (sd), dirección de punto final (el localaddr): Parámetro
Los clientes generalmente no tienen que llamar a la función bind
Servidor: número de puerto bien conocido, la dirección IP
int listen(sd,queuesize);
servidor de socket corriente lateral opuesto en estado de escucha, sólo las llamadas al servidor, solamente para toma de corriente orientado a la conexión
Configuración de un tamaño de solicitud de conexión de cola (QUEUESIZE)
Valor de retorno: 0: SOCKET_ERROR exitosa: Falló
connect(sd,saddr,saddrlen);
Llame a conectar el cliente al realizar la función de socket de cliente (SD) con un ordenador socket puerto específico en particular (el saddr) un (servicio) de conexión, sólo para el cliente, el cliente puede usar para el cliente TCP UDP también se pueden usar final, cliente TCP: establecer una conexión TCP, UDP cliente: especifica la dirección de punto final de servidor
newsock= accept(sd,caddr,caddrlen);
llamada a la función programa de servicio aceptar una cola de conexiones fue tomada en la parte superior de la solicitud del cliente desde un cliente solicita una toma de corriente en un sd estado de escucha, y crea un nuevo socket para crear un canal de conexión de socket con el cliente, sólo se al socket TCP, sólo para el servidor
El uso de las tomas de nueva creación (newsock) para comunicarse con los clientes
send(sd,*buf,len,flags);
Socket TCP función de envío (cliente y servidor), o llame a la función de conexión de socket de cliente UDP
sendto(sd,*buf,len,flags,destaddr,addrlen);
la función sendto para el socket del servidor UDP y conectar la función no se llama socket de cliente UDP
recv(sd,*buffer,len,flags);
servidor de UDP recibe función recv socket de cliente recibe los datos desde el otro extremo de la conexión TCP, o de una llamada a la función de conexión de datos enviados por
recvfrom(sd,*buf,len,flags,senderaddr,saddrlen);
terminal de la función recvfrom para recibir datos del socket UDP con el servidor no llama socket de cliente UDP función de conexión
int setsockopt(intsd, intlevel, intoptname, *optval, intoptlen);
función setsockopt () se utiliza para ajustar el parámetro de opción de la sd socket
int getsockopt(intsd, intlevel, intoptname, *optval, socklen_t*optlen);
una función getsockopt () se utiliza para obtener cualquier tipo, cualquier estado del valor actual de los zócalos de opción, y almacena el resultado optval
WSAStartup: inicializar la biblioteca socket (sólo WinSock)
WSACleanup: claro / interrumpir el uso de la biblioteca socket (sólo WinSock)
socket: crear connect socket: "Conectar" servidor remoto (sólo cliente)
closesocket: liberación / Cierre la toma bind: enlazar un socket local dirección IP y número de puerto (por lo general el cliente no lo hace)
la escucha: toma de servidor TCP lado opuesto está el modo de escucha, y establecer el tamaño de la cola (sólo servidor TCP socket)
aceptar: aceptar / extracción de una solicitud de conexión, se crea un nuevo socket, el nuevo socket (sólo para socket TCP del lado del servidor)
la recv: recibir datos (un socket de cliente TCP o modo conectado la toma de UDP)
recvfrom: recibir paquetes de datos (UDP socket utilizado para el modo no conectado)
enviar: envía datos (socket TCP para el cliente o el UDP socket modo conectado)
el sendto: el envío de paquetes de datos (UDP socket utilizado para el modo no conectado)
el setsockopt: juego de parámetros de opción de socket
getsockopt: Get socket opción de parámetros
orden de bytes de red
TCP / IP define una representación estándar entero binario de una cabecera de protocolo: orden de bytes de red (orden de bytes de red), algunos parámetros de la función API Socket necesita ser almacenado en orden de bytes de red (como la dirección IP, número de puerto, etc.)
orden de bytes nativo puede lograrse entre la función de conversión de orden de bytes de red
htons: orden de bytes nativo → orden de bytes de red (16bits)
ntohs: orden de bytes de orden de bytes de red → local (16bits)
htonl: orden de bytes nativo → orden de bytes de red (32 bits)
ntohl: orden de bytes de red local → orden de bytes (32 bits)
Las aplicaciones de red de socket API (TCP) para llamar flujo básico
La programación del zócalo - el diseño de software de cliente
Resolver la dirección IP del servidor
El cliente puede utilizar el nombre de dominio (por ejemplo .: study.163.com) o la dirección IP (por ejemplo: 123.58.180.121) identifica el servidor, utilizando el protocolo IP requiere un 32 bit de dirección IP binaria, es necesario convertir el nombre de dominio o la dirección IP es una dirección IP de 32 bits
La función inet_addr () salpicado-decimal dirección IP a la conversión de direcciones IP 32
gethostbyname () la función de dominio para lograr la conversión de direcciones IP 32, devuelve un puntero a una estructura hostent puntero
servidor de resolución (conocida) número de puerto
El cliente también puede usar el nombre del servicio (por ejemplo, HTTP) identificador de puerto de servidor, las necesidades de nombre de servicio que ser convertido a número de puerto bien conocido, la función getservbyname () devuelve un puntero a una estructura servent puntero
Protocolo de Resolución Nº
El cliente puede utilizar el nombre del protocolo (por ejemplo: el TCP) especificar el protocolo, las necesidades de protocolo para ser convertidos en protocolo de resolución de nombre (por ejemplo: 6), con función getprotobyname () implementan el protocolo número de protocolo de conversión de nombre, devuelve un puntero a una protoent estructura puntero
Proceso de Software de cliente TCP
1. Determinar la dirección IP del servidor y número de puerto
2. Crear un socket
3. Dirección de extremo local Asignar (dirección IP + número de puerto)
4. servidor de Connect (socket)
5. Seguir el protocolo de capa de aplicación para la comunicación
6. Cerrar la conexión / liberable
Proceso de Software de cliente UDP
1. Determinar la dirección IP del servidor y número de puerto
2. Crear un socket
3. Dirección de extremo local Asignar (dirección IP + número de puerto)
4. Especificar la dirección de punto final de servidor, la estructura de datagramas UDP
5. Seguir el protocolo de capa de aplicación para la comunicación
6. Cierre / liberación de la toma
la programación del zócalo - Diseño de software de servidor
4 tipos de servidor básica
- No bucle de conexión del servidor (sin conexión iterativo)
- servidor (orientado a conexión iterativo) orientado a la conexión Loop
- No hay conexiones simultáneas servidor (sin conexión concurrente)
- Concurrente orientado a la conexión (orientado a la conexión concurrente) tipos básicos de servidor de los servidores 4
servidor sin conexión bucle de flujo básico
1. Crear un socket
2. dirección de punto final Binding (INADDR_ANY + número de puerto)
3 recibe repetidamente una solicitud de un cliente
4. Siga el mensaje de respuesta de configuración del protocolo de capa de aplicación transmite al cliente
Transmisión de datos:
El servidor no puede utilizar la función connect (), el servidor sin conexión mediante la función sendto () para enviar paquetes de datos
El acceso a la dirección de punto final al cliente: Función recvfrom de llamadas () cuando se reciben datos, el extracto de forma automática
servidor orientado a la conexión procesa el ciclo básico
1. Crear un socket (principal), se unen y el número de puerto conocido;
2. Establecer el modo de socket de escucha (principal) pasiva, listo para el servidor;
3. La aceptación de llamada () toma la siguiente petición de conexión (a través de la toma de corriente principal), crea un nuevo socket para establecer una conexión con el cliente;
4. Seguir el protocolo de capa de aplicación, el cliente recibe la solicitud repetidos, construcciones y envía una respuesta (a través del nuevo socket);
5. Después de servicio para un cliente particular, cierra la conexión entre el cliente y vuelve a la etapa 3. El servidor orientado a la conexión de bucle procesa la básica
básica del servidor sin conexión simultánea flujo
El hilo principal 1: crear un socket, se unen y el número de puerto conocido;
El hilo principal 2: llama repetidamente recvfrom () para recibir la siguiente petición del cliente, y crea un nuevo hilo en respuesta al proceso del cliente;
1 hilo hijo: recibir una solicitud en particular;
hilo Child 2: De acuerdo con el mensaje de respuesta de configuración del protocolo de capa de aplicación, y pide la transmisión sendto ();
hilo Niño 3: Exit (un sub-hilo procesar una solicitud después de la terminación)
los procesos del servidor orientadas a la conexión concurrentes el básicas
El hilo principal 1: Crear el zócalo (principal), se unen y el número de puerto conocido;
El hilo principal 2: Conjunto modo de escucha socket pasivo (principal), listo para el servidor;
El hilo principal 3: en repetidas ocasiones de aceptación de llamada () toma la siguiente petición de conexión (a través de la toma de corriente principal), y crea un nuevo hilo hijo en respuesta al proceso del cliente;
hilo 1 niño: la recepción de una solicitud de servicio al cliente (por el socket creado recientemente);
hilo Child 2: Siguiendo el protocolo de capa de aplicación para interactuar con un cliente en particular;
hilo hijo 3: Desactivar / liberar la conexión y la salida (la terminación de subprocesos)
ejemplo
DÍA ciclo de servidor sin conexión
servidores orientados a conexión simultáneamente DAYTIME