Cómo utilizar getsockopt y setsockopt en Visual Basic
Establecer opciones para sockets de Windows.
s: Palabras descriptivas que identifican los sockets de Windows.
Nivel: Nivel definido por opciones; actualmente solo se admiten las capas SOL_SOCKET e IPPROTO_TCP.
Optname: La opción a configurar.
Optval: Puntero al buffer donde se almacena el valor de la opción.
opt len: la longitud del búfer opt val.
El uso de setsockopt() es muy complejo y sus funciones muy ricas. La función es establecer el valor de la opción de un socket de Windows de cualquier tipo y estado. Windows Sockets tiene dos opciones: una opción booleana que permite o deshabilita una característica y una opción plástica o estructural. Si las opciones booleanas están habilitadas, optval apunta a un número entero distinto de cero; si la opción está deshabilitada, optval apunta a un número entero igual a cero. Para opciones booleanas, optlen debe ser igual a sizeof(int); para otras opciones, optval se refiere al número entero o estructura que contiene la opción requerida y optlen se refiere a la longitud del número entero o estructura.
Valor de retorno: si no se produce ningún error, setsockopt() devuelve 0. De lo contrario, se devuelve un error SOCKET_ERROR y la aplicación puede obtener el código de error correspondiente a través de WSAGetLastError(). Código de error:
WSANOTINITIALISED: se debe realizar una llamada exitosa a WSAStartup() antes de usar esta API.
WSAENETDOWN: La implementación del socket WINDOWS para WINDOWS detectó una falla en el subsistema de red.
WSAEFAULT: optval no es una parte válida del espacio de direcciones del proceso.
WSAEINPROGRESS: Se está ejecutando la llamada de socket de Windows WINDOWS bloqueada.
wsaeinvalid: el valor del nivel es ilegal o la información en optval es ilegal.
WSAENETRESET: La conexión se agota después de configurar SO_KEEPALIVE.
WSAENOPROTOOPT: Opción desconocida o no compatible. El socket de Windows de tipo SOCK_STREAM no admite la opción SO_BROADCAST, y el socket de Windows de tipo SOCK_DGRAM no admite las opciones SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER y SO_OOBINLINE.
WSAENOTCONN: Cuando se establece SO_KEEPALIVE, la conexión se restablece.
WSAENOTSOCK: El descriptor no es un socket de Windows.
Los usos específicos son los siguientes:
1.closesocket (generalmente no se cierra inmediatamente pero pasa por el proceso de TIME_WAIT) quiere continuar reutilizando el socket:
BOOL bReuseaddr = TRUE
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *) & bReuseaddr, sizeof(BOOL));
2. el socket conectado sin pasar por el proceso TIME_WAIT:
BOOL bDontLinger = FALSE
setsockopt(s, SOL_SOCKET, SO_DONTLINGER, (const char *) amp; bDontLinger, sizeof(BOOL ))
3. En el proceso de envío () envío (), recv (), a veces debido a las condiciones de la red y otras razones, no se puede esperar el envío y la recepción, y el límite de tiempo para el envío y la recepción. se establece: p>
int nNetTimeout = 1000; //1 segundo
//Límite de tiempo de envío
setsockopt(socket, SOL_S0CKET, SO_SNDTIMEO, (char *) amp; nNetTimeout, sizeof(int));
//Tiempo de recepción setsockopt(socket, SOL_S0CKET, SO_RCVTIMEO, (char *); nNetTimeout, sizeof(int));
4 Al enviar (), devuelve los bytes realmente enviados (sincrónicos) o enviados al búfer del socket (asincrónicos). El estado de envío y recepción predeterminado del sistema es 8688 bytes (aproximadamente 8,5 K);
En el estado real. proceso Si la cantidad de datos enviados y recibidos es relativamente grande, se puede configurar un búfer de socket para evitar el envío y recepción en bucle continuo de send () send() y recv():
//Recibir búfer
int nRecvBuf = 32 * 1024;
//Establecer en 32K
setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char *) amp; nRecvBuf, sizeof(int));
//Enviar buffer int nSendBuf = 32 * 1024; //Establecer en 32K
setsockopt(s, SOL_SOCKET, SO_SNDBUF, (const char *) amp ; nSendBuf, sizeof(int));
5. Si no desea realizar una copia del búfer del sistema al búfer del socket, esto afectará el rendimiento de su programa:
int nZero = 0;
setsockopt(socket, SOL_S0CKET, SO_SNDBUF, (char *) & nZero, sizeof(nZero));
6. como en recv() (de forma predeterminada, el contenido del búfer del socket se copia al búfer del sistema):
int nZero = 0
setsockopt(socket, SOL_S0CKET, SO_RCVBUF, (char *) amp ;nZero, sizeof(int));
7. Por lo general, al enviar un datagrama UDP, desea que el socket envíe.
Los datos enviados tienen características de difusión:
BOOL bBroadcast = TRUE
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (const char *) amp; bBroadcast, sizeof(BOOL)); p> p>
8. Durante el proceso de conexión del cliente al servidor, si el socket del modo sin bloqueo está en el proceso de conexión (), puede configurar el retraso de conexión () hasta que se llame a accpet (). (Esta configuración de función solo está disponible en modo sin bloqueo. Tiene un efecto significativo en el proceso de bloqueo, pero tiene poco impacto en las llamadas a funciones bloqueadas).
BOOL bConditionalAccept = TRUE
setsockopt(s, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (const char *) amp; bConditionalAccept, sizeof(BOOL)); Si se llama a close socket() durante el proceso de envío de datos (el envío() no se completa y todavía hay datos no enviados), normalmente tomamos la medida de "cerrar tranquilamente" los apagados, SD_BOTH), pero los datos definitivamente estar perdido de. ¿Cómo puedo configurar el programa para cumplir con los requisitos de una aplicación específica (es decir, cerrar el socket después de enviar datos pendientes)?
Estructura persistente
{
u _ corta l _ onoff
u _ corta l _ persistente
};
Linger m_sLinger
m _ slinger . l _ onoff = 1; // (se permite permanecer al llamar a closesocket(), pero todavía hay datos por enviar) si m_slinger.l_onoff = 0; misma función que 2.
m _ slinger . l _ linger = 5; // (el tiempo de permanencia permitido es de 5 segundos)
setsockopt(s, SOL_SOCKET, SO_LINGER, (const char *) amp ; m_sLinger, sizeof(linger));
2. int Pascal far getsockopt (sockets, int nivel, int optname, charfar * optval, int far * opt len
s); : Palabra descriptiva que identifica un socket de Windows.
Nivel: El nivel definido por las opciones. Solo se admiten SOL_SOCKET e IPPROTO_TCP.
Las opciones de socket de Windows a obtener.
Optval: Puntero al buffer donde se almacena el valor de la opción obtenida.
Optlen: Puntero al valor de longitud del buffer optval.
Valor de retorno: si no se produce ningún error, getsockopt() devuelve 0. De lo contrario, se devuelve un error SOCKET_ERROR y la aplicación puede obtener el código de error correspondiente a través de WSAGetLastError().
Código de error:
WSANOTINITIALISED: se debe realizar una llamada exitosa a WSAStartup() antes de usar esta API.
WSAENETDOWN: La implementación del socket WINDOWS para WINDOWS detectó una falla en el subsistema de red.
WSAEFAULT: parámetro optlen no válido.
WSAEINPROGRESS: Se está ejecutando la llamada de socket de Windows WINDOWS bloqueada.
WSAENOPROTOOPT: Opción desconocida o no compatible. El socket de Windows de tipo SOCK_STREAM no admite la opción SO_BROADCAST, y el socket de Windows de tipo SOCK_DGRAM no admite las opciones SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER y SO_OOBINLINE. WSAENOTSOCK: El descriptor no es un socket de Windows.
Por ejemplo, obtenga el tamaño del búfer de recv.
int opt val = 0
int opt len = sizeof(opt val);
getsockopt(socket, SOL_SOCKET, SO_RCVBUF); , (char *) amp ;opt val & opt len);
temp format("tamaño del búfer de recepción del socket: optval: d, optlen: d ", optval, opt len);
AfxMessageBox(temp);