Red de conocimiento del abogados - Ley de patentes - ¡Tres preguntas prácticas sobre CSocket!

¡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

);

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 subyacente

WSAEHOSTUNREACH 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.