¡Tres preguntas prácticas sobre CSocket!
Leí mal la explicación en MSDN hace un momento:
CSocket::Create
Llame a la función miembro Crear después de construir un objeto de socket para crear el socket de Windows y adjúntelo.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL p>
);
Parámetros
nSocketPort
Un puerto particular que se usará con el socket, o 0 si desea que MFC seleccione un puerto .
nSocketType
SOCK_STREAM o SOCK_DGRAM.
lpszSocketAddress
Un puntero a una cadena que contiene la dirección de red del socket conectado, un número con puntos como "128.56.22.8".
Valor de retorno
Diferente a cero si la función tiene éxito; de lo contrario, 0 y se puede recuperar un código de error específico llamando a GetLastError
Observaciones
Create luego llama a Bind para vincular el socket a la dirección especificada. Se admiten los siguientes tipos de socket:
SOCK_STREAM Proporciona secuenciado, confiable y bidireccional. flujos de bytes basados en conexión Utiliza el protocolo de control de transmisión (TCP) para la familia de direcciones de Internet.
SOCK_DGRAM Admite datagramas, que son buffers sin conexión y no confiables de una longitud máxima fija (normalmente pequeña). Utiliza el protocolo de datagramas de usuario. (UDP) para la familia de direcciones de Internet Para utilizar esta opción, no debe utilizar el socket con un objeto CArchive
Nota
La función miembro Aceptar toma una referencia a un nuevo. , objeto CSocket vacío como parámetro. Debes construir este o.
bject antes de llamar a Accept. Tenga en cuenta que si este objeto de socket sale del alcance, la conexión se cierra. No llame a Create para este nuevo objeto de socket.
---------- ------------
sendto
La función sendto envía datos a un destino específico.
int sendto(
SOCKET s,
const char* buf,
int len,
int flags,
const struct sockaddr* to,
int tolen
);
Parámetros
s
[in] Descriptor que identifica a ( posiblemente conectado) socket
buf
[in] Búfer que contiene los datos a transmitir
len
[in] Longitud. de los datos en buf, en bytes.
flags
[in] Indicador que especifica la forma en que se realiza la llamada
a
.[in] Puntero opcional a una estructura sockaddr que contiene la dirección del socket de destino
tolen
[in] Tamaño de la dirección en bytes <. /p>
Valores devueltos
Si no se produce ningún error, sendto devuelve el número total de bytes enviados, que puede ser menor que el número indicado por len. De lo contrario, se devuelve un valor de SOCKET_ERROR y. se puede recuperar un código de error específico llamando a WSAGetLastError.
Código de error Significado
WSANOTINITIALISED Debe ocurrir una llamada exitosa a WSAStartup antes de usar esta función
WSAENETDOWN La red. el subsistema ha fallado.
WSAEACCES La dirección solicitada es una dirección de transmisión, pero no se configuró el indicador apropiado. Llame a setsockopt con el parámetro SO_BROADCAST para permitir el uso.
de la dirección de transmisión
WSAEINVAL Se especificó un indicador desconocido o se especificó MSG_OOB para un socket con SO_OOBINLINE habilitado
WSAEINTR Se canceló una llamada de bloqueo de Windows Sockets 1.1 a través de WSACancelBlockingCall <. /p>
WSAEINPROGRESS Hay una llamada de bloqueo de Windows Sockets 1.1 en curso o el proveedor de servicios todavía está procesando una función de devolución de llamada.
WSAEFAULT Los parámetros buf o to no forman parte del espacio de direcciones del usuario. o el parámetro tolen es demasiado pequeño
WSAENETRESET La conexión se ha interrumpido debido a que la actividad de mantenimiento de conexión detectó una falla mientras la operación estaba en progreso
WSAENOBUFS No hay espacio en el buffer.
WSAENOTCONN El socket no está conectado (solo sockets orientados a conexión).
WSAENOTSOCK El descriptor no es un socket.
WSAEOPNOTSUPP se especificó MSG_OOB. el socket no es de estilo de transmisión, como el tipo SOCK_STREAM, los datos OOB no se admiten en el dominio de comunicación asociado con este socket, o el socket es unidireccional y solo admite operaciones de recepción.
WSAESHUTDOWN El socket se ha cerrado. down; no es posible enviar a un socket después de que se haya invocado el apagado con how configurado en SD_SEND o SD_BOTH
WSAEWOULDBLOCK El socket está marcado como sin bloqueo y la operación solicitada se bloquearía
<. p>WSAEMSGSIZE El socket está orientado a mensajes y el mensaje es más grande que el máximo admitido por el transporte subyacenteWSAEHOSTUNREACH El host remoto c.
no se puede acceder desde este host en este momento
WSAECONNABORTED El circuito virtual finalizó debido a un tiempo de espera u otra falla. La aplicación debería cerrar el socket porque ya no se puede utilizar.
WSAECONNRESET El circuito virtual fue reiniciado por el lado remoto ejecutando un cierre forzado o abortivo. Para los sockets UPD, el host remoto no pudo entregar un datagrama UDP enviado previamente y respondió con un paquete ICMP de "Puerto inalcanzable". cierre el socket porque ya no se puede utilizar
WSAEADDRNOTAVAIL La dirección remota no es una dirección válida, por ejemplo, ADDR_ANY
WSAEAFNOSUPPORT Las direcciones de la familia especificada no se pueden utilizar con esto. socket.
WSAEDESTADDRREQ Se requiere una dirección de destino
WSAENETUNREACH No se puede acceder a la red desde este host en este momento
WSAEHOSTUNREACH Se intentó una operación de socket. un host inalcanzable
WSAETIMEDOUT La conexión se interrumpió debido a una falla de la red o porque el sistema en el otro extremo se cayó sin previo aviso. >La función sendto se utiliza para escribir datos salientes en un socket. Para sockets orientados a mensajes, se debe tener cuidado de no exceder el tamaño máximo de paquete de las subredes subyacentes, que se puede obtener usando getsockopt para recuperar el valor de la opción de socket. SO_MAX_MSG_SIZE. Si los datos son demasiado largos para pasar atómicamente a través del protocolo subyacente, se devuelve el error WSAEMSGSIZE y no se transmiten datos.
/p>
El parámetro to puede ser cualquier dirección válida en la familia de direcciones del socket, incluida una dirección de transmisión o de multidifusión. Para enviar a una dirección de transmisión, una aplicación debe haber usado setsockopt con SO_BROADCAST habilitado. De lo contrario, sendto fallará. con el código de error WSAEACCES Para TCP/IP, una aplicación puede enviar a cualquier dirección de multidifusión (sin convertirse en miembro del grupo).
Nota Si se abre un socket, se realiza una llamada setsockopt y luego una. Cuando se realiza una llamada sendto, Windows Sockets realiza una llamada de función de enlace implícita.
Si el socket no está vinculado, el sistema asigna valores únicos a la asociación local y luego el socket se marca como vinculado. Una aplicación puede usar getsockname para determinar el nombre del socket local en este caso.
La finalización exitosa de un envío a no indica que los datos se entregaron exitosamente.
La función de envío a normalmente es se utiliza en un socket sin conexión para enviar un datagrama a un socket par específico identificado por el parámetro to Incluso si el socket sin conexión se ha conectado previamente a una dirección específica, el parámetro to anula la dirección de destino para ese datagrama en particular solo en una conexión. -socket orientado, los parámetros to y tolen se ignoran, lo que hace que sendto sea equivalente a send.
Puede consultar MSDN para conocer estos, que tienen explicaciones muy detalladas.